Lösung 1:
Ich habe ein Skript erstellt, das diese Aufgabe erfüllt.
Die Idee stammt von James Lawries Antwort und diesem Beitrag: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
Legen Sie diese in eine Datei (zB "dump-all-memory-of-pid.sh") und machen Sie sie ausführbar
Verwendung:./dump-all-memory-of-pid.sh [pid]
Die Ausgabe erfolgt in Dateien mit den Namen:pid-startaddress-stopaddress.dump
Abhängigkeiten:gdb
Lösung 2:
Ich bin mir nicht sicher, wie Sie den gesamten Speicher in eine Datei ausgeben, ohne dies wiederholt zu tun (wenn jemand einen automatisierten Weg kennt, um gdb dazu zu bringen, lassen Sie es mich bitte wissen), aber das Folgende funktioniert für jeden Speicherstapel, vorausgesetzt, Sie wissen es die PID:
$ cat /proc/[pid]/maps
Dies hat das Format (Beispiel):
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
Wählen Sie einen Speicherstapel (also zum Beispiel 00621000-00622000) und verwenden Sie dann gdb als root, um ihn an den Prozess anzuhängen und diesen Speicher zu sichern:
$ gdb --pid [pid]
(gdb) dump memory /root/output 0x00621000 0x00622000
Analysieren Sie dann /root/output mit dem Strings-Befehl, wenn Sie nicht möchten, dass PuTTY auf Ihrem gesamten Bildschirm erscheint.
Lösung 3:
versuchen Sie es mit
gcore $pid
wobei $pid
ist die tatsächliche Nummer der PID; Weitere Informationen finden Sie unter:info gcore
Es kann einige Zeit dauern, bis der Speicherauszug erfolgt, und ein Teil des Speichers ist möglicherweise nicht lesbar, aber ausreichend ... Beachten Sie auch, dass große Dateien erstellt werden können. Ich habe auf diese Weise gerade eine 2-GB-Datei erstellt..
Lösung 4:
Reine Bash-Lösung:
procdump()
(
cat /proc/$1/maps | grep "rw-p" | awk '{print $1}' | ( IFS="-"
while read a b; do
dd if=/proc/$1/mem bs=$( getconf PAGESIZE ) iflag=skip_bytes,count_bytes \
skip=$(( 0x$a )) count=$(( 0x$b - 0x$a )) of="$1_mem_$a.bin"
done )
)
Verwendung:procdump PID
für einen saubereren Dump filtere *.so
heraus speicherabgebildete gemeinsam genutzte Bibliotheken und leere Speicherbereiche:
procdump()
(
cat /proc/$1/maps | grep -Fv ".so" | grep " 0 " | awk '{print $1}' | ( IFS="-"
while read a b; do
dd if=/proc/$1/mem bs=$( getconf PAGESIZE ) iflag=skip_bytes,count_bytes \
skip=$(( 0x$a )) count=$(( 0x$b - 0x$a )) of="$1_mem_$a.bin"
done )
)
Lösung 5:
man proc sagt:
/proc/[PID]/memDiese Datei kann verwendet werden, um über open(2), read(2) und lseek(2) auf die Seiten des Speichers eines Prozesses zuzugreifen.
Vielleicht kann es dir helfen