我想探索一个活着的进程的记忆,当我这样做时,这个进程一定不会受到干扰 - 所以将 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 中全是零(我没有在其中找到我要查找的字符串)。
作为一个额外的惊喜,我同时用不同的测试文件运行了一个类似的测试,发现我正在使用的另一个测试字符串(两个进程同时运行)应该在同一个位置( dump 和 greping 给出了相同的偏移量)。所以肯定有什么我不明白的地方。
/proc/pid/maps 不应该显示内存的偏移量(即:如果它说“XXX”位于偏移量 0x10,那么另一个程序不能使用相同的偏移量,对吗? - 这是我的第二个惊喜的来源)
如何读取 /proc/kmap 以获取属于我知道的 pid 进程的内存?