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

164

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

341008
источник
Примечание: strncmpи strstrдругие полезные функции C-запросов.
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功

Ответы:

198

Вы можете использовать strcmp:

break x:20 if strcmp(y, "hello") == 0

20номер строки, xможет быть любым именем файла и yлюбой переменной.

Натан Феллман
источник
9
Примечание: вы должны уже запустить программу, чтобы GDB увидел stdlib. В противном случае:No symbol "strcmp" in current context.
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
1
@CiroSantilli: Как настроить GDB, чтобы увидеть stdlib?
naive231
@ naive231 под словом «видеть» я имел в виду «видеть функции», чтобы вы могли разбить их, а не исходные тексты: для этого нужно нажать run, чтобы загружать динамические библиотеки. Для источника, Google это и найти: stackoverflow.com/questions/10000335/… :-)
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
1
Этот метод может иметь побочные эффекты. $_streqметод от @tlwhitec лучше.
Рул
55
break x if ((int)strcmp(y, "hello")) == 0

В некоторых реализациях gdb может не знать тип возвращаемого значения strcmp. Это означает, что вы должны были бы сыграть, иначе это всегда было бы верным!

Тобиас Домхан
источник
46

Начиная с GDB 7.5 вы можете использовать следующие удобные функции :

$_memeq(buf1, buf2, length)
$_regex(str, regex)
$_streq(str1, str2)
$_strlen(str)

Это кажется менее проблематичным, чем выполнение «чужого» strcmp()в стеке процесса при каждом достижении точки останова. Это особенно верно для отладки многопоточных процессов.

Обратите внимание, что ваша GDB должна быть скомпилирована с поддержкой Python, что не является проблемой для текущих дистрибутивов Linux. Конечно, вы можете проверить это, запустив show configurationGDB и выполнив поиск --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 .

tlwhitec
источник