【问题标题】:Dump memory of a process转储进程的内存
【发布时间】:2011-03-21 12:25:16
【问题描述】:

在读取 /proc/$PID/maps 时,您会得到映射的内存区域。 有没有办法转储其中一个区域?

$ cat /proc/18448/maps
...[snip]...
0059e000-005b1000 r-xp 00000000 08:11 40         /usr/local/lib/libgstlightning.so.0.0.0
005b1000-005b2000 r--p 00012000 08:11 40         /usr/local/lib/libgstlightning.so.0.0.0
005b2000-005b3000 rw-p 00013000 08:11 40         /usr/local/lib/libgstlightning.so.0.0.0
...[snip]...

谢谢

【问题讨论】:

    标签: c linux bash memory-dump


    【解决方案1】:

    不!使用PTRACE ATTACH 致电ptrace()。然后打开/proc/<pid>/mem,寻找区域偏移,读取/proc</pid>/maps给出的区域长度。

    这是在 C 中执行的 program I wrote。这是在 Python (and the ptrace binding) 中执行的 module I wrote。最后,program that dumps all regions of a process to files

    享受吧!

    【讨论】:

      【解决方案2】:

      您可以将 gdb 附加到进程,然后转储从位置 L 开始的长度为 X 个字的内存区域:x/Xw L

      在启动进程时附加 gdb 很简单:gdb ./executable 然后run。如果您需要附加到正在运行的进程,请启动 gdb 然后 gdb attach pid 其中 pid 是您关心的进程 ID。

      【讨论】:

      • 谢谢,:) 我还没考虑过
      • 您可以使用命令行参数附加到正在运行的进程:gdb -p <pid>
      • 很高兴知道。我只认真地将 gdb 用于远程目标。
      【解决方案3】:

      使用 dd(1):

      sudo dd if=/dev/mem bs=1 skip=$(( 16#0059e000 - 1 )) \
              count=$(( 16#005b1000 - 16#0059e000 + 1)) | hexdump -C
      

      【讨论】:

        猜你喜欢
        • 2014-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多