我想探索一个正在运行的进程的内存,当我这样做时,该进程一定不能被打扰-因此,将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进程的内存?
对于进程1234,您可以通过顺序读取/proc/1234/maps(文本伪文件)来获取其内存映射,并通过对稀疏伪文件的适当段进行read(2) -ing或mmap(2) -ing来读取虚拟内存/proc/1234/mem。
/proc/1234/maps
/proc/1234/mem
但是,我相信您无法避免某种同步(也许与ptrace(2)一样gdb),因为进程1234可以(并且确实)随时更改其地址空间(使用mmap&相关的系统调用)。
gdb
mmap
如果受监视的进程1234不是任意的,则情况有所不同,但是如果可以改进它以某种方式与监视进程进行通信,则情况会有所不同。
我不确定您为什么要问这个。并且gdb能够在watch不停止进程的情况下到达某个位置。
watch