GDB 无法插入内部断点

GDB can't insert internal breakpoint

本文关键字:内部 断点 插入 GDB      更新时间:2023-10-16

我在一个共享库(.so)的函数中添加了两个断点,并运行gdb 7.4并将其附加到进程。

Gdb遇到断点,我运行n几个步骤,Gdb报告了以下错误(带有bold文本):

(gdb)b[函数名称]
0xf1f28a49处的断点1:文件../../..//[文件名].cpp,第167行。
0xf1f2dae5处的断点2:文件../../..//[文件名].cpp,第60行。
警告:设置了多个断点
使用"delete"命令删除不需要的断点
(gdb)c
继续
[新线程0xcaafab90(LWP 28480)]
[线程0xcaafab90(LWP 28480)已退出]
[新线程0xcaafab90(LWP 29558)]
[新线程0xc8cb6b90(LWP 29980)]
[切换到线程0xc8cb6b90(LWP 29980)]

断点2,[函数名称](ostr=…,clientResponse=…,httpProtocol=…,>reqType=…),位于../../..//[文件名].cpp:60
60.../../../..//[文件名].cpp:没有这样的文件或目录
在../../../..//[文件名].cpp
(gdb)ni
0xf1f2daed 60英寸../../..//[文件名].cpp
(gdb)n

断点1,[函数名称](ostr=…,clientResponse=…,httpProtocol=…,>closeConn=…,asynchResponse=…,reqType=…)
在../../../..//[文件名].cpp:167
167英寸../../../..//[文件名].cpp
(gdb)n
警告:
无法插入断点0。
访问内存地址0x36cc6ded时出错:输入/输出错误

来自/lib/libc.so.6的siglongjmp()中的0xf7082771
(gdb)

这是/proc/[PID]/maps:
的输出

0804800-08146000 r-xp 00000000 08:03 293876

08146000-08150000 rw-p 000fe000 08:03 293876

08150000-009c8000 rw-p 08150000 00:00 0
[heap]
c21f9000-c21fa000--p c21f9000 00:00 0
c21fa000 c29fa000 rwxp c21fa00 00:00 0
c29fa000-c29fb000---pc29fa000 00:00 0
……
f1e1b000-f1e24000 rw-p f1e1b000 00:000
f1e24000-f2093000 r-xp 00000000 08:03 295549
.so
f2093000-f2094000--p 0026f000 08:03 295549
.so
f2094000-f2098000 r--p 0026f000 08:03 295549
.so
f2098000-f209c000 rw-p 00273000 08:03 295549
.so
f209c000-f209d000 rw-p f209c000 00:00 0

我的问题是:

  1. Gdb无法为ni命令插入内部断点,但如果文本部分位于0xf1******,为什么它要尝试访问地址0x36cc6dde?如您所见,该地址未包含在地图的输出中。

  2. 更普遍的问题是,我被告知共享库从0x40000000开始,但为什么在我的环境中不是这样?

共享库是用-fPIC编译的。我在上面的痕迹中隐藏了一些符号名称。

这可能与http://sourceware.org/bugzilla/show_bug.cgi?id=13987.请尝试最新的FSF GDB HEAD(可从以下网站获得:git://sourceware.org/git/gdb.git)。