Как установить условную точку останова в gdb, когда char* x указывает на строку, значение которой равно "hello"?
могу ли я указать, что я хочу, чтобы gdb сломался в строке x, когда char* x
указывает на строку, значение которой составляет "hello"
? Если да, то как?
3 ответа:
можно использовать
strcmp
:break x:20 if strcmp(y, "hello") == 0
20
- это номер строкиx
может быть любое имя файла иy
может быть любая переменная.
break x if ((int)strcmp(y, "hello")) == 0
в некоторых реализациях gdb может не знать возвращаемый тип strcmp. Это означает, что вам придется бросить, в противном случае он всегда будет оценивать истину!
С 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.