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

StackOverflow https://stackoverflow.com/questions/4183871

Вопрос

Могу ли я указать, что я хочу, чтобы 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top