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

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

Вы можете использовать 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() в стеке процесса каждый раз, когда 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  if $_streq(x, "hello") 

или, если ваша точка останова уже существует, и вы просто хотите добавить к ней условие

 condition  $_streq(x, "hello") 

$_streq только всей строке, поэтому, если вам нужно что-то более хитрое, вы должны использовать $_regex , который поддерживает синтаксис регулярного выражения Python .