如何在Linux中访问当前运行的Python进程中的数据结构?

11 投票
4 回答
2622 浏览
提问于 2025-04-16 04:57

我有一个运行很久的Python程序,它生成的数据比我预想的要多。我的结果会存储在一个列表里,等程序完成后会把这个列表序列化(也就是“打包”)然后写入硬盘——前提是程序能运行到那一步。但以现在的速度来看,列表很可能会用光超过1GB的可用内存,导致程序崩溃,这样我所有的结果都会丢失。

我打算修改我的脚本,让它定期把结果写入硬盘,但我也想尽可能保存当前正在运行的过程中的结果。有没有办法可以从一个正在运行的程序中抓取内存中的数据结构,然后写入硬盘呢?

我找到了code.interact()这个方法,但因为我在代码里没有这个钩子,所以对我来说似乎没什么用(如何查看当前正在运行的Python程序)。

我在Fedora 8上运行Python 2.5。有什么想法吗?

非常感谢。

Shahin

4 个回答

0

这个回答提供了关于如何将gdb工具连接到一个正在运行的Python程序的信息,并且里面有一些宏命令可以让你进入那个程序的pdb调试会话。我自己还没有尝试过,不过这个回答得到了20个赞,说明很多人觉得有用。虽然这样做可能会导致程序卡住,但在你的情况下,似乎值得一试。

1

虽然这个方法看起来不太好,但你可以尝试通过一个叫做proc文件系统来访问你程序的数据。这个文件系统的路径是/proc/[你的程序的进程ID]。proc文件系统里存储了很多关于每个进程的信息,比如当前打开的文件指针、内存映射等等。只要稍微研究一下,你可能就能找到你需要的数据。

不过,我觉得你还是应该在Python内部查看这个问题,做一些运行时的日志记录和调试。

4

对于正在运行的程序,你能做的事情不多。我能想到的唯一方法就是使用gdb调试器,先暂停这个进程,然后查看它的内存。或者,你可以确保你的系统设置为保存核心转储(core dump),然后用 kill --sigsegv <pid> 命令结束这个进程。这样你就可以用gdb打开核心转储,慢慢查看里面的内容。

有一些gdb的宏可以让你在gdb里查看Python的数据结构,还可以执行Python代码,但要让这些功能正常工作,你需要在编译Python时开启调试符号。我怀疑你可能没有这样做。先创建核心转储再重新编译Python并开启符号是行不通的,因为转储里的地址会和重新编译后的值不一样。

这里有一些链接,可以帮助你在gdb中查看Python:

http://wiki.python.org/moin/DebuggingWithGdb

http://chrismiles.livejournal.com/20226.html

或者你可以在网上搜索“python gdb”。

注意:要让Linux创建核心转储,你需要使用ulimit命令。

ulimit -a 可以显示当前的限制设置。

ulimit -c unlimited 将允许创建任意大小的核心转储。

撰写回答