转储一个Linux进程的内存到文件

是否有可能将分配给进程的当前内存(通过PID)转储到文件? 或者以某种方式读取它?

我不知道如何将所有的内存转储到一个文件中,而不需要重复这些操作(如果有人知道自动获取gdb的方法,请让我知道),但是如果你知道任何一批内存pid:

 $ cat /proc/[pid]/maps 

这将是格式(示例):

 00400000-00421000 r-xp 00000000 08:01 592398 /usr/libexec/dovecot/pop3-login 00621000-00622000 rw-p 00021000 08:01 592398 /usr/libexec/dovecot/pop3-login 00622000-0066a000 rw-p 00622000 00:00 0 [heap] 3e73200000-3e7321c000 r-xp 00000000 08:01 229378 /lib64/ld-2.5.so 3e7341b000-3e7341c000 r--p 0001b000 08:01 229378 /lib64/ld-2.5.so 

select一批内存(例如00621000-00622000),然后使用gdb作为root连接到进程并转储该内存:

 $ gdb --pid [pid] (gdb) dump memory /root/output 0x00621000 0x00622000 

然后用strings命令分析/ root / output,减less你想要的屏幕上的PuTTY。

我已经完成了这个任务的脚本。

这个想法从詹姆斯·劳瑞的答案和这个职位: http : //www.linuxforums.org/forum/programming-scripting/52375-reading-memory-other-processes.html#post287195

 #!/bin/bash grep rw-p /proc/$1/maps | sed -n 's/^\([0-9a-f]*\)-\([0-9a-f]*\) .*$/\1 \2/p' | while read start stop; do gdb --batch --pid $1 -ex "dump memory $1-$start-$stop.dump 0x$start 0x$stop"; done 

把它放在一个文件中(例如“dump-all-memory-of-pid.sh”)并使其可执行

用法: ./dump-all-memory-of-pid.sh [pid]

输出将打印到名称为pid-startaddress-stopaddress.dump

依赖关系: gdb

尝试

  gcore $pid 

其中$pid$pid的实际编号; info gcore了解更多信息,请参阅: info gcore

转储可能需要一些时间才能发生,有些内存可能不可读,但足够好…还要知道它可以创build大文件,我只是创build了一个2GB的文件。

man proc说:

/ proc / [pid] / mem这个文件可以通过open(2),read(2)和lseek(2)来访问进程内存的页面。

也许它可以帮助你

我做了我自己的程序来转储整个进程的内存,这是在C中,所以它可以交叉编译到Android,这是我所需要的。

你也可以指定IP地址和TCP端口。 源代码在这里 。