一尘不染

读取活动过程内存而不会中断它

linux

我想探索一个正在运行的进程的内存,当我这样做时,该进程一定不能被打扰-因此,将gdb附加到该进程(这将停止它)是不可行的。因此,我想从/ proc /
kcore获取此信息(如果您知道执行此操作的另一种方法,请告诉我)。所以我做了一个小实验。我创建了一个名为TEST的文件,其中仅包含“
EXTRATESTEXTRA”。然后我用更少的时间打开它

$ less TEST

我得到了这个过程的PID

$ ps aux | grep TEST
user    7785  0.0  0.0  17944   992 pts/8    S+   16:15   0:00 less TEST
user    7798  0.0  0.0  13584   904 pts/9    S+   16:16   0:00 grep TEST

然后,我使用此脚本创建了所有文件的转储:

#!/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

(我在这个网站上找到它https://serverfault.com/questions/173999/dump-a-linux-processs-
memory-to-file)

$ sudo ./dump_all_pid_memory.sh 7785

之后,我在所有转储文件中寻找“ TRATESTEX”:

$ grep -a -o -e '...TRATESTEX...' ./*.dump
./7785-00624000-00628000.dump:HEXTRATESTEXTRA
./7785-00b8f000-00bb0000.dump:EXTRATESTEXTRA
./7785-00b8f000-00bb0000.dump:EXTRATESTEXTRA

因此,我得出结论,该字符串必须在0x00624000和0x00628000之间出现。因此,我将偏移量转换为十进制数,并使用dd从/ proc /
kcore获取内存:

$ sudo dd if="/proc/kcore" of="./y.txt" skip="0" count="1638400" bs=1

令我惊讶的是,文件y.txt充满了零(我没有在其中找到要查找的字符串)。

令我惊讶的是,我同时使用不同的测试文件运行了类似的测试,发现我正在使用的其他测试字符串(两个同时运行较少的进程)应该在同一位置找到(转储和greping给出了相同的偏移量)。所以肯定有些我不明白的东西。

  • / proc / pid / maps是否应该显示内存的偏移量(即:如果说“ XXX”位于偏移量0x10处,则另一个程序不能使用相同的偏移量,对吗?-这是我第二个惊喜的来源)

  • 我如何读取/ proc / kmap以获得属于我知道的pid进程的内存?


阅读 230

收藏
2020-06-03

共1个答案

一尘不染

对于进程1234,您可以通过顺序读取/proc/1234/maps(文本伪文件)来获取其内存映射,并通过对稀疏伪文件的适当段进行read(2)
-ing或mmap(2) -ing来读取虚拟内存/proc/1234/mem

但是,我相信您无法避免某种同步(也许与ptrace(2)一样gdb),因为进程1234可以(并且确实)随时更改其地址空间(使用mmap&相关的系统调用)。

如果受监视的进程1234不是任意的,则情况有所不同,但是如果可以改进它以某种方式与监视进程进行通信,则情况会有所不同。

我不确定您为什么要问这个。并且gdb能够在watch不停止进程的情况下到达某个位置。

2020-06-03