Ответы:
Вы можете использовать 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 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 .
strncmpиstrstrдругие полезные функции C-запросов.