在Linux下,我该如何使用Python读取进程的内存?

7

我想使用Python和Python Ptrace读取外部进程的内存。我需要完全使用Python来实现这个功能,并一直在尝试在Linux中读取并输出进程的内存。

例如,我尝试了以下代码,但一直出现IO错误:

proc_mem = open("/proc/%i/mem" % process.pid, "r")
print proc_mem.read()
proc_mem.close()

我只想重复转储进程的内存并查看随时间变化的内容。如果这是正确的方法,那么我的问题在哪里?或者有没有更合适的方法?


5
这个问题似乎已经在http://unix.stackexchange.com/questions/6301/how-do-i-read-from-proc-pid-mem-under-linux中得到详细回答。 - larsks
似乎尝试读取/proc/%i/mem文件并不是我想要做的方式。所以,我的另一半问题仍然存在。假设我可能想要写入进程内存页面,那么有没有适当的方法在Python中实现这一点?我正在使用ptrace来启动和停止进程。 - rvorderm
这个演示程序在此链接中给出:http://www.mail-archive.com/fusil@lists.tuxfamily.org/msg00011.html,似乎与我正在尝试做的事情非常相关,尽管我还没有完全复制它。在ptrace中有一个函数,可以搜索内存映射中的字节字符串。 - rvorderm
我在我的充裕的空闲时间里仍在解决这个问题。所以,为了回答larsks的问题更清楚,我不仅想读取它,还需要能够在RAM中触及它。因此,我可以使用ptrace附加到进程,启动和停止等操作,但我想知道如何进入内存空间并翻转一些位。 - rvorderm
2个回答

2

使用子进程模块从Python中调用shell命令

import subprocess

# ps -ux | grep 1842 (Assuming 1842 is the process id. replace with process id you get)

p1 = subprocess.Popen(["ps", "-ux"], stdout=subprocess.PIPE)
p2 = subprocess.Popen(["grep", "1842"], stdin=p1.stdout, stdout=subprocess.PIPE)
p1.stdout.close()  # Allow p1 to receive a SIGPIPE if p2 exits.
output = p2.communicate()[0]
print output

并解析输出以查看其内存利用率

2
解析格式化输出似乎不如使用/proc文件系统干净--这正是它的预期用途。 - hexparrot
你说得对。但是根据需求的范围,理解命令并解析它不比了解proc文件系统容易吗?如果不是这样的话,我想Iarsks提供的链接已经很好地回答了这个问题。 - Sudheer
这最终成为了我能想到的最接近的东西。更重要的是,对于我正在处理的项目来说是足够的。 - rvorderm

1
大多数情况下,我只想重复转储进程的内存并查看随时间的变化。如果这是正确的方法,那么我的问题是什么?或者有更合适的方法吗?
您可能会对gdb的反向调试感兴趣,它记录了进程内存的所有更改。这里是教程谷歌缓存)。
如果您想使用原始记录工具进行操作,则还有Robert O'Callahan编年史/时间旅行者工作

这也是一个很棒的答案。事实上,如果我还没有用Sudheer的答案完成我的小项目,这个答案本来会成为我接受的答案。 - rvorderm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接