Can I specify that I want gdb to break at line x when char* x
points to a string whose value equals "hello"
? If yes, how?
You can use strcmp
:
break x:20 if strcmp(y, "hello") == 0
20
is line number, x
can be any filename and y
can be any variable.
No symbol "strcmp" in current context.
–
Silber run
for that so that dynamic libraries get loaded. For source, google it and find: #10000835 :-) –
Silber $_streq
method from @tlwhitec is better. –
Gala Use a break condition with $_streq
(one of GDB's own convenience functions):
break [where] if $_streq(x, "hello")
or, if your breakpoint already exists, add the condition to it:
condition <breakpoint number> $_streq(x, "hello")
Since GDB 7.5 (long ago) you can use that and a handful of other native convenience functions for various string matching, including $_regex
which supports the Python regex syntax:
$_memeq(buf1, buf2, length)
$_regex(str, regex)
$_streq(str1, str2)
$_strlen(str)
These are quite less problematic than having to execute the usual strcmp()
injected to the process' stack, because that can have undesired side effects.
Alas, using the native functions is not always possible, because they rely on GDB being compiled with Python support. This is usually the default, but some constrained environments might not have it. To be sure, you can check it by running show configuration
inside GDB and searching for --with-python
. This shell oneliner does the trick, too:
gdb -n -quiet -batch -ex 'show configuration' | grep 'with-python'
malloc
, I wouldn't expect a python runtime either :) Also I'm pretty sure strcmp
doesn't use malloc
at all, so I must say I'm pretty confused by your comment :) My recommendation to avoid strcmp
stems from the fact that it can have side effects (so by debugging your program you inject something that wouldn't be there otherwise). I hit that problem while debugging a highly multithreaded process, where using strcmp
in gdb just broke the whole process. –
Giavani strcmp
call into a process if one of the arguments is a string literal, GDB must create that string in the process's memory. To do this is uses malloc
. For convenience functions which are run in the GDB process, it doesn't need to allocate the string on the inferior. –
Imbrue malloc
in the inferior, GDB can still call strcmp()
, if it is a valid function pointer symbol. You just can't do strcmp(x, "astring")
because the string literal requires malloc
. –
Imbrue break x if ((int)strcmp(y, "hello")) == 0
On some implementations gdb might not know the return type of strcmp. That means you would have to cast, otherwise it would always evaluate to true!
© 2022 - 2024 — McMap. All rights reserved.
strncmp
andstrstr
are other useful C query functions. – Silber