Как мне установить условную точку останова в GDB, когда Char* x указывает на строку, значение которого равна «привет»?
-
10-10-2019 - |
Вопрос
Могу ли я указать, что я хочу, чтобы 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()
В стеке процесса каждый раз, когда точка останова достигается.
Обратите внимание, что ваш 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.