Условные точки останова на строке в отладчике GDB - PullRequest
0 голосов
/ 24 марта 2020

Попытка установить условную точку останова для остановки при заданном c значении строки.

Следующий набор команд, которые я пробовал:

Установить 1:

(gdb) b file.C:97 if strcmp(pName, "abc") == 0

набор 2:

(gdb) b file.C:97
(gdb) cond 1 !strcmp(pName, "abc")

набор 3:

(gdb) b file.C:97
(gdb) set $str = "abc"
(gdb) cond 1 strcmp (pName, $str) == 0

Оба эти завершение ошибки сегментации в STL strcmp:

Continuing.
Detaching after fork from child process 12742.
Detaching after fork from child process 12818.
Detaching after fork from child process 12819.
FUSION: detected debugger running, not catching non-fusion exceptions

Program received signal SIGSEGV, Segmentation fault.
__strcmp_sse42 () at ../sysdeps/x86_64/multiarch/strcmp.S:260
Error in testing breakpoint condition:
The program being debugged was signaled while in a function called from GDB.
GDB remains in the frame where the signal was received.
To change this behavior use "set unwindonsignal on".
Evaluation of the expression containing the function
(__strcmp_sse42) will be abandoned.
When the function is done executing, GDB will silently stop.

Breakpoint 1, __strcmp_sse42 () at ../sysdeps/x86_64/multiarch/strcmp.S:260
/usr/src/debug/glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/strcmp.S:260:7925:beg:0x32f912871a

Использование find() не заканчивается ошибкой сегментации, но точка останова останавливается без применения условия:

(gdb) b file.C:97
(gdb) set $str = "abc"
(gdb) cond 1 pName.find($str) == 0

Эти вышеупомянутые команды, которые я пробовал GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-47.el6

Если я попытаюсь GNU gdb (GDB) 8.1.90.20180726-git, это заканчивается новой проблемой.

Хотя pName определяется как строка,

Я получаю следующее после остановки отладчика в точке останова (без условия с помощью strcmp()):

(gdb) print pName
4: (string)pName = {static npos = <optimized out>, _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0x2aebca8 "xyz"}}

Вкл. GDB 7.6.1-47.el6, после применения простой точки останова (без каких-либо условий), печатать только pName дает 'xyz'.

Можно ли сделать то же самое в GDB 8.1.90.20180726?

В любом случае, пожалуйста, предложите мне способ поставить условие brea kpoint на строку успешно!

1 Ответ

0 голосов
/ 24 марта 2020

Этот работал на GDB 7.6.1-47.el6!

(gdb) b file.C:97
(gdb) cond 1 ((int)strcmp(pName.c_str(), "abc")) == 0

Пожалуйста, дайте мне знать, если у кого-то есть лучший ответ!

...