【发布时间】:2014-05-03 20:07:40
【问题描述】:
我有一个 python 代码正在调用一个用 C 编写的共享库(并使用带有标志的调试信息编译:-g -O0 -Wall -fPIC)。
我想用gdb 进入c 代码。我执行以下操作:
- 我从终端调用 python 代码,并在代码中调用
import pdb; pdb.set_trace()进行内部步骤。 - 我将
gdb的进程附加到python进程的pid
当我用gdb附加时,没有找到一些关于系统库的调试信息(很明显),但是找到了我的共享库的调试信息。当我尝试将断点放入so的源文件之一时,我写了b filename.c:30,但gdb说它无法访问内存:
Cannot access memory at address 0x128a
可能是因为我用icc 编译了库,而我正在调试gdb?
万一我有点惊讶,因为我已经用gdb成功调试了其他用intel编译的程序。
有什么想法吗?
编辑:
我已经用 gcc 重新编译了,我仍然有这个问题。我在想,为了放置断点,我需要共享库中函数的名称,我猜它有一个前缀,比如lib.function。我怎么知道那个前缀?
编辑2:
我很困惑,如果我写list <name of function>,gdb 会显示与函数对应的正确源代码
编辑:
按照我打开gdb并输入以下命令的答案之一:
(gdb)info functions f
All functions matching regular expression "f":
File ../source/ffile.c:
double f(double, double, double, double, double);
Non-debugging symbols:
0x0000000000000a68 f@plt
(gdb)break f
Cannot access memory at address 0x124a
【问题讨论】:
-
如果您显示确切的错误会有所帮助。如果 gdb 可以正确“列出”,则意味着它正在查找调试信息。该错误表明内核可能正在拒绝该请求;或者调试信息中有一些错误。
-
@TomTromey 我编辑了我的问题
标签: python c debugging memory gdb