linux - Python读取Linux内存过程报错(/proc/$pid/mem)

标签 linux python-2.7 memory process

我在一些 Linux 发行版(Debian、Linux Mint...)上测试了以下代码并正常工作,但在 CentOS 下,即使我以 root 身份运行它,我也会收到错误消息:

#!/usr/bin/env python
import re
maps_file = open("/proc/18396/maps", 'r')
mem_file = open("/proc/18396/mem", 'r', 0)
for line in maps_file.readlines():  # for each mapped region
    m = re.match(r'([0-9A-Fa-f]+)-([0-9A-Fa-f]+) ([-r])', line)
    if m.group(3) == 'r':  # if this is a readable region
        start = int(m.group(1), 16)
        end = int(m.group(2), 16)
        mem_file.seek(start)  # seek to region start
        chunk = mem_file.read(end - start)  # read region contents
        print chunk,  # dump contents to standard output
maps_file.close()
mem_file.close()

脚本读取进程的内存并转储可读区域。在 CentOS 5.4 x64 下我得到以下错误:

Traceback (most recent call last):
  File "./mem.py", line 11, in ?
    chunk = mem_file.read(end - start)  # read region contents
IOError: [Errno 3] No such process

进程是活的且可读的:

[root@localhost ~]# ps xa|grep 18396
18396 ?        S      0:00 /usr/sbin/httpd
[root@localhost ~]# ls -al /proc/18396/maps && ls -al /proc/18396/mem
-r--r--r-- 1 root root 0 Jan 31 17:26 /proc/18396/maps
-rw------- 1 root root 0 Jan 31 17:26 /proc/18396/mem

有什么想法吗?我在 Python 2.4 下尝试过它,Python 2.7 可以在类似 Debian 的发行版上运行,但不能在 CentOS 下运行。

最佳答案

经过一番挖掘,我自己找到了答案:

#!/usr/bin/env python
import ctypes, re, sys

## Partial interface to ptrace(2), only for PTRACE_ATTACH and PTRACE_DETACH.
c_ptrace = ctypes.CDLL("libc.so.6").ptrace
c_pid_t = ctypes.c_int32 # This assumes pid_t is int32_t
c_ptrace.argtypes = [ctypes.c_int, c_pid_t, ctypes.c_void_p, ctypes.c_void_p]
def ptrace(attach, pid):
    op = ctypes.c_int(16 if attach else 17) #PTRACE_ATTACH or PTRACE_DETACH
    c_pid = c_pid_t(pid)
    null = ctypes.c_void_p()
    err = c_ptrace(op, c_pid, null, null)
    if err != 0: raise SysError, 'ptrace', err

pid = "18396"

ptrace(True, int(pid))
maps_file = open("/proc/"+pid+"/maps", 'r')
mem_file = open("/proc/"+pid+"/mem", 'r', 0)
for line in maps_file.readlines():  # for each mapped region
    m = re.match(r'([0-9A-Fa-f]+)-([0-9A-Fa-f]+) ([-r])', line)
    if m.group(3) == 'r':  # if this is a readable region
        start = int(m.group(1), 16)
        end = int(m.group(2), 16)
        mem_file.seek(start)  # seek to region start
        chunk = mem_file.read(end - start)  # read region contents
        print chunk,  # dump contents to standard output
maps_file.close()
mem_file.close()
ptrace(False, int(pid))

关于linux - Python读取Linux内存过程报错(/proc/$pid/mem),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21483984/

相关文章:

java - 这是在 java 中进行深度复制以进行内存基准测试的正确方法吗?

c++ - static const char * const 和 static const char [] 有什么区别?

linux - 使用 find 列出所有图形图像文件?

python - 即使输出与原始输出相同,代码仍会保存文档?

python - ElementTree Unicode 编码/解码错误

C++:将映射文件读入矩阵的快速方法

linux - 当一个应用程序在 linux 上发布时,如何使其与大多数窗口管理器兼容?

android - 如何在自定义基于 android 的开发板上进行 root 或 GPIO 访问

linux - 使用 EMAIL 发送电子邮件

python - 嵌套列表上的 min/max 函数如何工作?