我在一个共享库 (.so) 的函数中添加了两个断点,然后运行gdb 7.4
并将其附加到一个进程。
gdb打断点,我跑n
了几步,gdb报如下错误(加粗):
(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 in ../../../../../[文件名].cpp
(gdb) n
警告:
无法插入断点 0。
访问内存地址 0x36cc6dde 时出错:输入/输出错误。 /lib/libc.so.6 (gdb)
中的 siglongjmp () 中的 0xf7082771
这是来自的输出/proc/[PID]/maps
:
08048000-08146000 R-XP 000000 08:03 293876
08146000-08150000 RW-P 000FE000 08:03 293876
08150000-099C8000-099C8000 RW-P -P 08150000 0000 0000 000 000 000 000 000 000 c21 c21 c21 c21f9 hea c21f9 hea c21f9 hea c21f9 hea c21 c21f9 hea
c21f9 heae c29fa000 rwxp c21fa000 00:00 0 c29fa000-c29fb000 ---p c29fa000 00:00 0 ……<br> f1e1b000-f1e24000 rw-p f1e1b000 00:00 0 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-P 00273000 08:03 295549 .SO F209C000 F209C000 C209C000 C209CCC 000 cc.
我的问题是:
Gdb 无法为命令插入内部断点,但是如果文本部分位于
ni
,为什么它会尝试访问地址?如您所见,该地址不包含在映射的输出中。0x36cc6dde
0xf1******
更一般的问题,有人告诉我共享库开始于
0x40000000
但为什么在我的环境中不是这种情况?
共享库是用-fPIC
. 我在上面的痕迹中隐藏了一些符号名称。