Как установить условную точку останова в gdb, когда char * x указывает на строку, значение которой равно "привет"?

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

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

Начиная с 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.