GDB无法插入内部断点

问题描述:

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

GDB断点处,我跑n几个步骤,和gdb报告以下错误(与大胆文本):

(GDB)B [函数名]
断点1在0xf1f28a49 :文件../../../../../[file name] .cpp,第167行。
0xf1f2dae5的断点2:文件../../../../../ [文件名] .cpp,第60行。
警告:设置了多个断点。
使用“删除”命令删除不需要的断点。 (gdb)
继续。
[新主题0xcaafab90(LWP 28480)]
[线程0xcaafab90(LWP 28480)退出]
[新主题0xcaafab90(LWP 29558)]
[新主题0xc8cb6b90(LWP 29980)]
[切换主题0xc8cb6b90(LWP 29980)]

断点2,[函数名称](ostr = ...,clientResponse = ...,httpProtocol = ...,> reqType = ...)在../../ ../../../[file name] .cpp:60
60 ../../../../../[file name] .cpp:没有这样的文件或目录。
in ../../../../../[file name] .cpp
(gdb)ni
0xf1f2daed 60 in ../../../../../ [文件名]的.cpp
(GDB)N

断点1,[函数名](OSTR = ...,clientResponse = ...,httpProtocol = ...,> closeConn = ...,asynchResponse = ...,reqType = ...)
at ../../../../../[file name] .cpp:167
167 in ../../../ ../../[file name] .cpp
(gdb)n
警告:
无法插入断点0.
访问内存地址0x36cc6dde时出错:输入/输出错误。

0xf7082771 signgjmp()from /lib/libc.so。6
(GDB)

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

08048000-08146000 R-XP 00000000 08:03 293876

08146000-08150000 RW-P 000fe000 08: 03 293876

08150000-099c8000 rw-p 08150000 00:00 0
[堆]
c21f9000-c21fa000 --- p c21f9000 00:00 0
c21fa000-c29fa000 rwxp c21fa000 00:00 0
c29fa000-c29fb000 --- p c29fa000 00:00 0
......
f1e1b000-f1e24000 RW-P 00:00 f1e1b000 0
f1e24000-f2093000 R-XP 00000000 08 :03 295549
。所以
f2093000-f2094000 --- p 0026f000 08:03 295549
。所以
f2094000-f2098000 [R - p 0026f000 08:03 295549
。所以
f2098000-RW f209c000-p 00273000 08 :03 295549
.so
f209c000-f209d000 rw-p f209c000 00:00 0

我的问题是:

  1. GDB未能插入内部断点ni命令,但为什么它尝试0xf1******如果文本部分是访问地址0x36cc6dde这个地址不包含在?你可以看到地图的输出。

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

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

+0

超过0xc0000000的Mmm addresess通常是内核映射的地址。为什么你的进程在用户空间中使用thiese地址? – MirkoBanchi 2012-03-06 20:12:08

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