Ответы:
Вы можете использовать strcmp
:
break x:20 if strcmp(y, "hello") == 0
20
номер строки, x
может быть любым именем файла и y
любой переменной.
No symbol "strcmp" in current context.
run
, чтобы загружать динамические библиотеки. Для источника, Google это и найти: stackoverflow.com/questions/10000335/… :-)
$_streq
метод от @tlwhitec лучше.
break x if ((int)strcmp(y, "hello")) == 0
В некоторых реализациях gdb может не знать тип возвращаемого значения strcmp. Это означает, что вы должны были бы сыграть, иначе это всегда было бы верным!
Начиная с GDB 7.5 вы можете использовать следующие удобные функции :
$_memeq(buf1, buf2, length)
$_regex(str, regex)
$_streq(str1, str2)
$_strlen(str)
Это кажется менее проблематичным, чем выполнение «чужого» 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 .
strncmp
иstrstr
другие полезные функции C-запросов.