是否可以将为进程分配的当前内存(通过PID)转储到文件中?还是以某种方式阅读?
是否可以将为进程分配的当前内存(通过PID)转储到文件中?还是以某种方式阅读?
Answers:
我不确定如何将所有内存转储到文件中而无需重复执行此操作(如果有人知道让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
选择一批内存(例如00621000-00622000),然后使用gdb作为root附加到进程并转储该内存:
$ gdb --pid [pid]
(gdb) dump memory /root/output 0x00621000 0x00622000
然后,使用strings命令分析/ root / output,从而减少整个屏幕上的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
rw-p
权限范围内查找和丢弃范围?
rw-p
),其他范围用于代码(r-xp
)。如果您想两者都转储,则继续grep
进行例如的交换cat
。
尝试
gcore $pid
$pid
pid的实际编号在哪里;有关更多信息,请参见:info gcore
可能需要一些时间才能进行转储,并且某些内存可能不可读,但是足够好...还要注意,它可以创建大文件,我只是这样创建了一个2GB的文件。
gcore
转储稀疏文件吗?
我也编写了自己的程序来转储整个进程的内存,它在C语言中,因此可以交叉编译到Android,这正是我所需要的。
您还可以指定IP地址和tcp端口。源代码在这里。
纯bash解决方案:
procdump ()
{
cat /proc/$1/maps | grep "rw-p" | awk '{print $1}' | ( IFS="-"
while read a b; do
count=$(( bd-ad ))
ad=$(printf "%llu" "0x$a")
bd=$(printf "%llu" "0x$b")
dd if=/proc/$1/mem bs=1 skip=$ad count=$count of=$1_mem_$a.bin
done )
}
用法:procdump PID
为了更清洁的转储:
procdump ()
{
cat /proc/$1/maps | grep -Fv ".so" | grep " 0 " | awk '{print $1}' | ( IFS="-"
while read a b; do
ad=$(printf "%llu" "0x$a")
bd=$(printf "%llu" "0x$b")
dd if=/proc/$1/mem bs=1 skip=$ad count=$(( bd-ad )) of=$1_mem_$a.bin
done )
}
将过程转储到标准输出pcat / memdump的工具:
现在,您可以在Linux上的SysInternals套件中使用procdump:
/proc/$pid/mem
。