181

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?

341008
  • 9,522
  • 11
  • 48
  • 84

3 Answers3

217

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.

tshepang
  • 11,360
  • 21
  • 88
  • 132
Nathan Fellman
  • 116,304
  • 97
  • 251
  • 314
71

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'
tlwhitec
  • 1,545
  • 12
  • 15
  • "but some constrained environments might not have it." Indeed, embedded systems libc does not always provide a malloc() function, so gdb cannot call strcmp(). In this case $_streq() is prefered, thanks for the tip ! – Dali Aug 31 '21 at 12:15
  • @Dali In an environment so stripped down that there's no `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. – tlwhitec Aug 31 '21 at 13:21
  • 1
    "In an environment so stripped down that there's no malloc, I wouldn't expect a python runtime either :)" In my case gdb is used as part of a cross-compilation environnement. The program runs on the embedded system, Gdb client on a linux host. So yes my gdb client has been built with python support. – Dali Sep 03 '21 at 15:06
  • "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)." Your answer can thankfully solve more problems than the one you encountered, that's what I meant. – Dali Sep 03 '21 at 15:08
  • 1
    strcmp calls points to your debugged program implementation. Here is a gdb output to illustrate: (gdb) call strcmp("hello", "world") evaluation of this expression requires the program to have a function "malloc". – Dali Sep 03 '21 at 15:10
  • Whereas the convenience function is available : (gdb) call $_streq("hello", "hello") $25 = 1. So then again thanks for your answer, it helped me and potentially other embedded systems developper. – Dali Sep 03 '21 at 15:18
58
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!

tshepang
  • 11,360
  • 21
  • 88
  • 132
Tobias Domhan
  • 2,926
  • 1
  • 16
  • 12