我已经使用gdb
多年了,但以前从未见过这种行为。
为了调试来自程序中某个地方的双SIGABRT
的free()
,我在指向缓冲区的指针上设置了一个观察点。现在,当我再次运行程序时,gdb会“停止”,就好像我按了ctrl或它收到了SIGSTOP。
你知道那是怎么回事吗?我该怎么避免?
# gdb --version
GNU gdb (GDB) Red Hat Enterprise Linux 8.2-6.el8
# uname -a
Linux Centos8 4.18.0-147.el8.x86_64 #1 SMP Wed Dec 4 21:51:45 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
错误:
(gdb) run
free(): invalid pointer
Program received signal SIGABRT, Aborted.
0x00007ffff6ad48df in raise () from /lib64/libc.so.6
(gdb) bt
#0 0x00007ffff6ad48df in raise () from /lib64/libc.so.6
#1 0x00007ffff6abecf5 in abort () from /lib64/libc.so.6
#2 0x00007ffff6b17c17 in __libc_message () from /lib64/libc.so.6
#3 0x00007ffff6b1e53c in malloc_printerr () from /lib64/libc.so.6
#4 0x00007ffff6b2210e in free_check.part () from /lib64/libc.so.6
#5 0x00007ffff7bbde99 in MyProgram::parseTSPayload (this=0x6165b0) at MyProgram.cpp:284
...
#8 0x0000000000401b4c in main (argc=6, argv=0x7fffffffea28) at MyProgram.cpp:169
(gdb) f 5
#5 0x00007ffff7bbde99 in MyProgram::parseTSPayload (this=0x6165b0) at MyProgram.cpp:284
284 delete [] mpPESBuf;
设置观察点:
(gdb) watch mpPESBuf
Hardware watchpoint 2: mpPESBuf
(gdb) info watch
Num Type Disp Enb Address What
2 hw watchpoint keep y mpPESBuf
现在,当我再次运行该程序时,gdb会“停止”,就好像我按了ctrl或它收到了SIGSTOP:
(gdb) run
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: MyProgram
[1]+ Stopped gdb MyProgram
# fg
gdb MyProgram
Error in re-setting breakpoint 2: No symbol "mpPESBuf" in current context.
Error in re-setting breakpoint 2: No symbol "mpPESBuf" in current context.
Error in re-setting breakpoint 2: No symbol "mpPESBuf" in current context.
warning: Loadable section ".note.gnu.property" outside of ELF segments
warning: Loadable section ".note.gnu.property" outside of ELF segments
[1]+ Stopped gdb MyProgram
# fg
gdb MyProgram
Error in re-setting breakpoint 2: No symbol "mpPESBuf" in current context.
[PID 687305] MyProgram Version 1.1-18
Built 2020.11.24-11:43:08. Launched 2020-11-24 11:56:17.
free(): invalid pointer
Program received signal SIGABRT, Aborted.
0x00007ffff6ad48df in raise () from /lib64/libc.so.6
发布于 2020-11-24 09:42:05
这是GDB中使用此commit修复的一个bug:
https://sourceware.org/legacy-ml/gdb-patches/2019-05/msg00361.html
此提交在GDB 9中,您正在使用8.2。为了避免这个问题,您需要更新GDB的版本。
https://stackoverflow.com/questions/64980070
复制相似问题