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


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

3 135

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.