GDB无法插入内部断点

时间:2012-03-05 09:38:24

标签: c++ linux gdb shared-libraries proc

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

Gdb点击了断点,我跑了n几步,gdb报告了以下错误(粗体文字):

  

(gdb)b [功能名称]
  断点1在0xf1f28a49:文件../../../../../ [文件名] .cpp,第167行。
  断点2在0xf1f2dae5:文件../../../../../ [文件名] .cpp,第60行。
  警告:设置了多个断点   使用“删除”命令删除不需要的断点   (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)ni
  0xf1f2daed 60 in ../../../../../[file name] .cpp
  (gdb)n
  
  断点1,[函数名称](ostr = ...,clientResponse = ...,httpProtocol = ...,> closeConn = ...,asynchResponse = ...,reqType = ...)
     at ../../../../../[file name] .cpp:167
  167 in ../../../../../[file name] .cpp
  (gdb)n
  警告:
  无法插入断点0。
  访问内存地址时出错0x36cc6dde:输入/输出错误。
  
  来自/lib/libc.so.6的siglongjmp()中的0xf7082771   (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 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

我的问题是:

  1. Gdb无法为ni命令插入内部断点,但如果文本部分位于0x36cc6dde,为什么它会尝试访问地址0xf1******?该地址不包括在内在你可以看到的地图输出中。

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

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

1 个答案:

答案 0 :(得分:-2)

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