访问核心转储中的 Python 对象

发布于 2024-07-26 06:51:34 字数 59 浏览 6 评论 0原文

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

Is there anyway to discover the python value of a PyObject* from a corefile in gdb

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

萌吟 2024-08-02 06:51:34

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

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

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

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

It's lots of work, but of course it can be done, especially if you have all the symbols. Look at the header files for the specific version of Python (and compilation options in use to build it): they define PyObject as a struct which includes, first and foremost, a pointer to a type. Lots of macros are used, so you may want to run the compile of that Python from sources again, with exactly the same flags but in addition a -E to stop after preprocessing, so you can refer to the specific C code that made the bits you're seeing in the core dump.

A type object has, among many other things, a string (array of char) that's its name, and from it you can infer what exactly objects of that type contain -- be it content directly, or maybe some content (such as a length, i.e. number of items) and a pointer to the actual data.

I've done such super-advanced post-mortem debugging a couple of times (starting with VERY precise knowledge of the Python versions involved and all the prepared preprocessed sources &c) and each time it took me a day or two (were I still a freelance and charging by the hour, if I had to bid on such a task I'd say at least 20 hours -- at my not-cheap hourly rates!-).

IOW, it's worth it only if it's really truly the only way out of some very costly pickle. On the plus side, it WILL teach you more about Python's internals than you ever thought was there, even after memorizing every line of the sources. Good luck, you'll need some!!!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文