【发布时间】:2012-03-22 19:02:15
【问题描述】:
我在一个共享库 (.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=...) at ../../../../../[文件名].cpp:60
60 ../../../../../[文件名].cpp:没有这样的文件或目录。
在 ../../../../../[文件名].cpp
(gdb) 你
../../../../../[文件名].cpp 中的 0xf1f2daed 60
(gdb) n
断点 1,[函数名称](ostr=...,clientResponse=...,httpProtocol=...,>closeConn=...,asynchResponse=...,reqType=...)
在 ../../../../../[文件名].cpp:167
167 在 ../../../../../[文件名].cpp
(gdb) n
警告:
无法插入断点 0。
访问内存地址 0x36cc6dde 时出错:输入/输出错误。
0xf7082771 in siglongjmp () 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-0909c8000 rw-p > [堆]
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 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 00273000 08:03 295549
.so
f209c000-f209d000 rw-p f209c000 00:00 0
我的问题是:
Gdb 无法为
ni命令插入内部断点,但是如果文本部分位于0xf1******,为什么它会尝试访问地址0x36cc6dde?该地址不包含在映射的输出中你可以看到。更一般的问题,有人告诉我共享库从
0x40000000开始,但为什么在我的环境中不是这种情况?
共享库使用-fPIC 编译。我在上面的痕迹中隐藏了一些符号名称。
【问题讨论】:
-
0xc0000000 以上的嗯地址通常是内核映射的地址。为什么您的进程在用户空间中使用这些地址?
标签: c++ linux gdb shared-libraries proc