Как установить условную точку останова в 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.