在核心转储中访问Python对象

3 投票
1 回答
1159 浏览
提问于 2025-04-15 12:40

有没有办法在gdb中从核心文件里找到PyObject*的Python值?

1 个回答

5

这项工作量很大,但当然是可以做到的,特别是当你拥有所有符号的时候。你可以查看特定版本的Python的头文件(以及用于构建它的编译选项):这些文件定义了PyObject作为一个结构体,其中最重要的是一个指向类型的指针。这里使用了很多宏,所以你可能想要重新从源代码编译那个Python,使用完全相同的参数,但加上一个-E选项,这样可以在预处理后停止,这样你就可以查看在核心转储中看到的具体C代码。

一个类型对象有很多东西,其中包括一个字符串(字符数组),这是它的名字。通过这个名字,你可以推测出该类型的对象具体包含什么——可能是直接的内容,或者一些内容(比如长度,也就是项目的数量)和指向实际数据的指针。

我曾经做过几次这种超级高级的死后调试(从非常精确的Python版本知识和所有准备好的预处理源代码开始),每次都花了我一两天时间(如果我还在做自由职业,并按小时收费的话,如果我需要对这样的任务报价,我会说至少20小时——以我不便宜的小时费率来算!)。

换句话说,只有在真的没有其他办法解决一些非常棘手的问题时,这样做才是值得的。好的一面是,这将让你了解Python内部的更多知识,甚至比你想象的还要多,即使你已经记住了源代码的每一行。祝你好运,你会需要一些运气的!

撰写回答