我有一个 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
.
有什么想法吗?
编辑:
我已经用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
最佳答案
可能有两个原因:
- 图书馆尚未映射或
- 你遇到了 bug# 54151,看看 https://bugzilla.redhat.com/show_bug.cgi?id=54151
关于python - gdb 找到调试信息但不能下断点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22643775/