将 Linux 进程的内存转储到文件

将 Linux 进程的内存转储到文件

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

答案1

我不确定如何在不重复执行此操作的情况下将所有内存转储到文件中(如果有人知道让 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),然后以 root 身份使用 gdb 连接到该进程并转储该内存:

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

然后使用 strings 命令分析 /root/output,这样你就不会希望 PuTTY 出现在整个屏幕上。

答案2

我编写了一个完成此任务的脚本。

这个想法来自 James Lawrie 的回答和这篇文章:https://web.archive.org/web/20190921091546/http://www.linuxforums.org/forum/programming-scripting/52375-reading-memory-other-processes-post287195.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

答案3

尝试

    gcore $pid

$pid其中 pid 的实际数字是多少;有关更多信息,请参见:info gcore

转储可能需要一些时间,并且某些内存可能无法读取,但已经足够好了...还请注意,它可以创建大文件,我刚刚通过这种方式创建了一个 2GB 的文件。

答案4

我制作了自己的程序来转储整个进程内存,它是用 C 语言编写的,因此可以交叉编译到 Android,这正是我所需要的。

您还可以指定 IP 地址和 TCP 端口。源代码这里

相关内容