Відповіді:
Ви можете використовувати strcmp
:
break x:20 if strcmp(y, "hello") == 0
20
- це рядок, x
може бути будь-яке ім'я файлу і y
може бути будь-якою змінною.
No symbol "strcmp" in current context.
run
, щоб динамічні бібліотеки завантажувалися. Для джерела
$_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
. Цей маленький онлайнер теж робить свою справу:$ 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
інші корисні функції запиту С.