访问核心转储中的 Python 对象

Ed *_*d L 3 python postmortem-debugging python-c-api

无论如何,有没有办法从 gdb 中的 corefile 中发现 PyObject* 的 python 值

Ale*_*lli 5

这是很多工作,但当然可以完成,特别是如果您拥有所有符号。查看特定版本 Python 的头文件(以及用于构建它的编译选项):它们将 PyObject 定义为一个结构体,其中首先也是最重要的是一个指向类型的指针。使用了很多宏,因此您可能希望再次从源代码运行该 Python 的编译,使用完全相同的标志,但另外还有一个 -E 在预处理后停止,因此您可以参考生成这些位的特定 C 代码你在核心转储中看到。

类型对象除了许多其他内容外,还有一个字符串(字符数组)作为其名称,从中您可以推断出该类型的对象到底包含什么——无论是直接内容,还是某些内容(例如长度) ,即项目数)和指向实际数据的指针。

我已经做过几次这种超高级的事后调试(从非常精确地了解所涉及的 Python 版本和所有准备好的预处理源代码开始),每次都花了我一两天的时间(我还是一个自由职业者,按小时收费,如果我必须竞标这样的任务,我会说至少 20 小时——以我不便宜的小时费率!-)。

IOW,只有当它真的是摆脱一些非常昂贵的泡菜的唯一途径时,它才值得。从好的方面来说,即使在记住了每一行源代码之后,它也会教给你更多关于 Python 内部原理的知识,比你想象的要多。祝你好运,你需要一些!