Ich bin mir nicht sicher, wie Sie den gesamten Speicher in eine Datei speichern können, ohne dies wiederholt zu tun (wenn jemand eine automatisierte Methode kennt, um GDB dazu zu bringen, lassen Sie es mich bitte wissen), aber das Folgende funktioniert für einen Stapel Speicher, vorausgesetzt, Sie wissen es die pid:
Wählen Sie eine Speichercharge aus (z. B. 00621000-00622000), und verwenden Sie dann gdb als Root, um eine Verbindung zum Prozess herzustellen und diesen Speicher zu sichern:
Genial! Ich habe es nur verwendet, um herauszufinden, welches Skript auf einer mysteriösen Bash-Instanz ausgeführt wurde.
Tobia
Warum greifen Sie nur mit Berechtigungen nach Bereichen und geben sie frei rw-p?
mxmlnkn
@mxmlnkn Das sind data ( rw-p), die anderen Bereiche sind für code ( r-xp). Wenn Sie einen Dump von beiden wollen, dann gehen Sie vor und tauschen Sie grepfür zB cat.
A. Nilsson
39
Versuchen
gcore $pid
wo $pidist die tatsächliche Anzahl der PID; Weitere Informationen finden Sie unter:info gcore
Es kann einige Zeit dauern, bis der Speicherauszug erstellt wird, und ein Teil des Speichers ist möglicherweise nicht lesbar, aber ausreichend. Beachten Sie, dass große Dateien erstellt werden können. Ich habe gerade eine 2-GB-Datei auf diese Weise erstellt.
Dies ist nicht ausreichend, da zum Lesen eines anderen Prozesses eine Kombination aus / proc / <pid> / {mem, * maps}, ptrace und einer gewissen Signalbehandlung erforderlich ist, um ein Aufhängen des Zielprozesses zu vermeiden.
Ich habe mein eigenes Programm erstellt, um auch den gesamten Prozessspeicher zu sichern. Es befindet sich in C, sodass es auf Android überspielt werden kann, was ich auch brauchte.
Sie können auch die IP-Adresse und den TCP-Port angeben. Quellcode hier .
Soweit ich weiß, besteht die Idee hinter dem Cleaner - Dump darin, dass im Gegensatz zum eigentlichen Anwendungsspeicher, der die Größe 0 hat, nur In - Memory - Dateien eine Größe an den Speicherbereich angehängt haben (da die tatsächlich verwendete Größe dem nicht bekannt ist) OS).
mxmlnkn
Ein Problem, das ich mit diesem Skript habe, ist, dass die Blockgröße von 1 zu einer Bandbreite von unannehmbar langsamen ~ 30kB / s führt, verglichen mit der Verwendung einer Blockgröße, die der Seitengröße (4096 für mich) entspricht, für die ich ~ 100MB / s bekomme! Sehen Sie hier . getconf PAGESIZEwird verwendet, um die Seitengröße zu erhalten, und dann werden die Adressen und Zählwerte durch diese geteilt.
mxmlnkn
1
Tool zum Speichern des Prozesses in der Standardausgabe, pcat / memdump:
Dieser ist veraltet (auf Antrag des Betreuers entfernt); Ich habe das alte Paket trotzdem installiert und es ist fehlgeschlagen mit "Eingabe- / Ausgabefehler; haben Sie GCC mit den Header-Dateien eines anderen Computers verwendet?".
Tobu
0
Sie können jetzt procdump aus der SysInternals-Suite unter Linux verwenden:
Wenn Sie ein separates Speichersegment des laufenden Prozesses sichern möchten, ohne eine große Kerndatei (z. B. mit gcore) zu erstellen, können Sie von hier aus ein kleines Tool verwenden . Es gibt auch einen Einzeiler in README, wenn Sie alle lesbaren Segmente in separate Dateien speichern möchten.
/proc/$pid/mem
.Antworten:
Ich bin mir nicht sicher, wie Sie den gesamten Speicher in eine Datei speichern können, ohne dies wiederholt zu tun (wenn jemand eine automatisierte Methode kennt, um GDB dazu zu bringen, lassen Sie es mich bitte wissen), aber das Folgende funktioniert für einen Stapel Speicher, vorausgesetzt, Sie wissen es die pid:
Dies wird im Format (Beispiel) sein:
Wählen Sie eine Speichercharge aus (z. B. 00621000-00622000), und verwenden Sie dann gdb als Root, um eine Verbindung zum Prozess herzustellen und diesen Speicher zu sichern:
Analysieren Sie dann / root / output mit dem Befehl strings, und Sie möchten PuTTY nicht auf dem gesamten Bildschirm sehen.
quelle
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
stelle dies in eine Datei (zB "dump-all-memory-of-pid.sh") und mache es ausführbar
Verwendungszweck:
./dump-all-memory-of-pid.sh [pid]
Die Ausgabe erfolgt in Dateien mit folgenden Namen:
pid-startaddress-stopaddress.dump
Abhängigkeiten:
gdb
quelle
rw-p
?rw-p
), die anderen Bereiche sind für code (r-xp
). Wenn Sie einen Dump von beiden wollen, dann gehen Sie vor und tauschen Siegrep
für zBcat
.Versuchen
wo
$pid
ist die tatsächliche Anzahl der PID; Weitere Informationen finden Sie unter:info gcore
Es kann einige Zeit dauern, bis der Speicherauszug erstellt wird, und ein Teil des Speichers ist möglicherweise nicht lesbar, aber ausreichend. Beachten Sie, dass große Dateien erstellt werden können. Ich habe gerade eine 2-GB-Datei auf diese Weise erstellt.
quelle
gcore
eine Sparse-Datei?Mann proc sagt:
Vielleicht kann es dir helfen
quelle
Ich habe mein eigenes Programm erstellt, um auch den gesamten Prozessspeicher zu sichern. Es befindet sich in C, sodass es auf Android überspielt werden kann, was ich auch brauchte.
Sie können auch die IP-Adresse und den TCP-Port angeben. Quellcode hier .
quelle
Reine bash Lösung:
Verwendung: procdump PID
für eine sauberere Müllkippe:
quelle
getconf PAGESIZE
wird verwendet, um die Seitengröße zu erhalten, und dann werden die Adressen und Zählwerte durch diese geteilt.Tool zum Speichern des Prozesses in der Standardausgabe, pcat / memdump:
quelle
Sie können jetzt procdump aus der SysInternals-Suite unter Linux verwenden:
https://github.com/Microsoft/ProcDump-for-Linux
quelle
Wenn Sie ein separates Speichersegment des laufenden Prozesses sichern möchten, ohne eine große Kerndatei (z. B. mit gcore) zu erstellen, können Sie von hier aus ein kleines Tool verwenden . Es gibt auch einen Einzeiler in README, wenn Sie alle lesbaren Segmente in separate Dateien speichern möchten.
quelle