Как мне установить условную точку останова в gdb, когда char * x указывает на строку, значение которой равно "hello"? - PullRequest
153 голосов
/ 15 ноября 2010

Могу ли я указать, что я хочу, чтобы gdb разрывался в строке x, когда char* x указывает на строку, значение которой равно "hello"?Если да, то как?

Ответы [ 3 ]

190 голосов
/ 15 ноября 2010

Вы можете использовать strcmp:

break x:20 if strcmp(y, "hello") == 0

20 - номер строки, x может быть любым именем файла и y - любой переменной.

52 голосов
/ 22 марта 2012
break x if ((int)strcmp(y, "hello")) == 0

В некоторых реализациях gdb может не знать тип возвращаемого значения strcmp.Это означает, что вам придется разыграть, иначе оно всегда будет иметь значение true!

33 голосов
/ 10 мая 2017

Начиная с GDB 7.5 вы можете использовать эти удобные удобные функции :

$_memeq(buf1, buf2, length)`
$_streq(str1, str2)
$_strlen(str)
$_regex(str, regex)

Кажется гораздо менее проблематичным, чем выполнение "чужого" strcmp()в стеке процесса каждый раз при достижении точки останова.

Обратите внимание, что ваша GDB должна быть скомпилирована с поддержкой Python, что не является проблемой для текущих дистрибутивов Linux.Конечно, вы можете проверить это, запустив show configuration внутри GDB и выполнив поиск --with-python.Этот маленький oneliner тоже делает свое дело:

$ gdb -n -quiet -batch -ex 'show configuration' | grep 'with-python'
             --with-python=/usr (relocatable)

Для вашего демонстрационного случая, использование будет

break <where> if $_streq(x, "hello")

или, если ваша точка останова уже существует, и вы просто хотитечтобы добавить к нему условие

condition <breakpoint number> $_streq(x, "hello")

$_streq соответствует только всей строке, поэтому, если вы хотите что-то более хитрое, вы должны использовать $_regex, который поддерживает синтаксис регулярного выражения Python .

...