如何通过Python从GDB的内存地址获取对象
我有一个核心文件和一个二进制文件(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
。