【问题标题】:How can I read the memory of a process in python in linux?如何在linux中读取python中进程的内存?
【发布时间】:2012-11-28 06:04:08
【问题描述】:

我正在尝试使用 python 和 python ptrace 来读取外部进程的内存。我需要完全在 python 中工作,我一直在尝试读取和打印 linux 中进程的内存。

例如,我尝试了以下代码,它不断给我 IO 错误:

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

大多数情况下,我只是想反复转储进程的内存并寻找随时间的变化。如果这是正确的方法,那么我的问题是什么?或者有没有更合适的方法来做到这一点?

【问题讨论】:

  • 这似乎在unix.stackexchange.com/questions/6301/…得到了详细的回答
  • 似乎尝试读取 /proc/%i/mem 文件并不是我真正想要的方式。所以我猜我的问题的另一半。假设我可能想写入进程内存页面,是否有合适的方法在 python 中执行此操作?我正在使用 ptrace 来启动和停止进程。
  • link: 给出的这个演示程序似乎与我正在尝试做的事情密切相关,尽管我还不能完全复制它。 ptrace 中有一个函数可以在内存映射中搜索字节字符串。
  • 在我的 丰富 空闲时间里仍在研究这个问题。所以让我更清楚地回答 larsks,我不想只是阅读它,我还需要能够在 RAM 中触摸它。所以我可以使用 ptrace 附加到进程、启动和停止等,但我想知道如何进入内存空间并翻转一些位。

标签: python linux ptrace


【解决方案1】:

从 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

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

【讨论】:

  • 解析格式化输出似乎不像使用 /proc fs 那样干净——这正是它的目的。
  • 你是对的。但是根据需求的范围,理解命令和解析它不是比理解proc文件系统更容易吗?如果不是,我猜 Iarsks 提供的链接很好地回答了这个问题
  • 这最终是我能想到的最接近的结果。更重要的是,对于我正在从事的项目来说已经足够了。
【解决方案2】:

大多数情况下,我只是想反复转储进程的内存并寻找随时间的变化。如果这是正确的方法,那么我的问题是什么?或者有没有更合适的方法来做到这一点?

您可能对gdb 的reverse debugging 感兴趣,它记录了对进程内存的所有更改。这里是the tutorial (google cache)。

还有Robert O'CallahanChronicle/Chronomancerwork,如果你想用原始录音工具玩的话。

【讨论】:

  • 这也是一个很棒的答案。事实上,除了已经使用 Sudheer 的答案完成了我的小项目之外,这将是我接受的答案。
猜你喜欢
  • 1970-01-01
  • 2014-02-24
  • 2021-06-09
  • 1970-01-01
  • 1970-01-01
  • 2019-04-08
  • 2012-05-11
  • 2023-03-30
相关资源
最近更新 更多