Відповіді:
Ви можете використовувати 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інші корисні функції запиту С.