如何通过Python从GDB的内存地址获取对象

0 投票
1 回答
1119 浏览
提问于 2025-04-18 18:38

我有一个核心文件和一个二进制文件(C++)。我在用gdb分析核心文件时,如果我尝试打印一个指针,它会显示出内存地址。但是当我想打印这个指针的原始内容时,它会告诉我:

没有一个可以调试的进程,你无法做到这一点。

这里有个例子:

(gdb) p objPtr
(gdb) $1 = {px = 0x12345678}
(gdb) p *objPtr
(gdb) You can't do this without a process to debug.

其实,这很合理,因为核心文件并不是那个二进制文件的进程。但是核心文件应该保存二进制文件崩溃时的状态,我觉得应该有办法从一个指针中获取原始内容。

我研究过写一个Python脚本来处理这个问题。但首先,如果我们在gdb中无法执行这样的 p *ptr,那我的Python脚本怎么能从那个内存地址获取对象呢?

任何参考资料或GitHub项目都会很有帮助。

更新:

我发现我可以这样做:

(gdb) p *ptr.px

这解决了我之前的问题。

但现在我的问题变成了,如果我想写一个帮助在GDB中调试的脚本,如何在Python脚本中获取 .px 这个东西呢?

1 个回答

1

其实我自己找到了答案。因为在我的例子中,objPtr是一个指针,所以像*objPtr这样的写法被认为是在调用这个指针的某个函数或方法。正确的写法应该是p *objPtr.px

撰写回答