2

无论如何从 gdb 中的核心文件中发现 PyObject* 的 python 值

4

1 回答 1

4

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

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

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

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

于 2009-07-03T21:18:06.873 回答