Як встановити умовну точку розриву в gdb, коли char * x вказує на рядок, значення якого дорівнює "привіт"?


164

Чи можу я вказати, що я хочу, щоб gdb перервався у рядку x, коли char* xвказує на рядок, значення якого дорівнює "hello"? Якщо так, то як?


Примітка: strncmpта strstrінші корисні функції запиту С.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Відповіді:


198

Ви можете використовувати strcmp:

break x:20 if strcmp(y, "hello") == 0

20- це рядок, xможе бути будь-яке ім'я файлу і yможе бути будь-якою змінною.


9
Примітка. Ви повинні вже запустити програму, щоб GDB бачив stdlib. В іншому випадку:No symbol "strcmp" in current context.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

1
@CiroSantilli 六四 事件 法轮功 包 卓 轩: Як налаштувати gdb, щоб побачити stdlib?
naive231

@ naive231 під "див" я мав на увазі бачити функції, щоб ви могли перерватися на них, а не на джерело: ви повинні натиснути run, щоб динамічні бібліотеки завантажувалися. Для джерела
перейдіть на

1
Цей метод може мати побічні ефекти. $_streqметод від @tlwhitec краще.
коти

55
break x if ((int)strcmp(y, "hello")) == 0

У деяких реалізаціях gdb може не знати тип повернення strcmp. Це означає, що вам доведеться кинути роль, інакше це завжди буде оцінено як справжнє!


46

Оскільки 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 .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.