How do I set a conditional breakpoint in gdb, when char* x points to a string whose value equals "hello"?
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.
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'
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!