Могу ли я указать, что я хочу, чтобы gdb разбивался на строку x, когда char* x
указывает на строку, значение которой равно "hello"
? Если да, то как?
Как установить условную точку останова в gdb, когда char * x указывает на строку, значение которой равно "привет"?
Ответ 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.