Ich möchte die Erinnerung an einen lebendigen Prozess erforschen, und wenn ich dies tue, darf der Prozess nicht gestört werden - also gdb an den Prozess anhängen (was würde es stoppen) ist keine Option. Deshalb möchte ich diese Informationen von/proc/kcore bekommen (wenn Sie eine andere Möglichkeit kennen, lassen Sie es mich bitte wissen). Also habe ich ein kleines Experiment gemacht. Ich habe eine Datei namens TEST mit nur "EXTRATESTEXTRA" erstellt. Dann öffnete ich es mit wenigerLesen des Prozessspeichers des Prozesses, ohne ihn zu unterbrechen (/ proc/kcore ist eine Option)
$ less TEST
ich die PID dieses Prozesses mit
$ 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
bekam Und dann habe ich dieses Skript einen Dump aller Dateien zu erstellen:
#!/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
(Ich fand es auf dieser Seite https://serverfault.com/questions/173999/dump-a-linux-processs-memory-to-file)
$ sudo ./dump_all_pid_memory.sh 7785
Danach suchte ich nach „TRATESTEX“ in allen abgespeicherte Dateien:
$ grep -a -o -e '...TRATESTEX...' ./*.dump
./7785-00624000-00628000.dump:HEXTRATESTEXTRA
./7785-00b8f000-00bb0000.dump:EXTRATESTEXTRA
./7785-00b8f000-00bb0000.dump:EXTRATESTEXTRA
So stellte ich fest, dass es irgendwo ein Vorkommen dieser Zeichenfolge zwischen 0x00624000 und 0x00628000 sein muss. Daher konvertierte ich die Offsets in Dezimalzahlen und verwenden dd um den Speicher zu erhalten aus/proc/kcore:
$ sudo dd if="/proc/kcore" of="./y.txt" skip="0" count="1638400" bs=1
Zu meiner Überraschung war die Datei y.txt voller Nullen (ich nicht die Zeichenfolge gefunden Ich habe darin gesucht).
Als Bonusüberraschung führte ich gleichzeitig einen ähnlichen Test mit einer anderen Testdatei durch und stellte fest, dass der andere Teststring, den ich verwendete (beide Prozesse mit weniger waren zur gleichen Zeit ausgeführt) bei gefunden werden sollte der gleiche Standort (das Dumping und das Greifen gaben den gleichen Offset). Also muss es etwas geben, was ich nicht klar verstehe.
Ist nicht das/proc/pid/maps den Offset des Speichers (dh zeigen soll: wenn es sagen würde, „XXX“ in 0x10 versetzt ist, könnte ein anderes Programm nicht die gleiche Uhr Offset verwenden werden Ich richtig? - das ist die Quelle meiner zweiten Überraschung)
Wie kann ich/proc/kmap lesen, um den Speicher zu bekommen, der zu einem Prozess gehört, den ich kenne?
EDIT - für zukünftigen stumblers (siehe Antwort unten zuerst)
Um die Antworten zusammenfassen und meinen eigenen Kommentar hinzu: -/proc/pid/maps zeigt die Teile des Speichers AS THE PROCESS SEES IT (unterschiedlich für jeden Prozess, Suche nach Speicherabbildung auf Linux), so dass verschiedene Prozesse scheinbar den gleichen Teil des Speichers verwenden (wie er aus ihrer Perspektive aussieht).Sie können die hier angegebenen Teile aus/proc/pid/mem als Super-User lesen (oder einen übergeordneten Prozess wie gdb tut es mit ptrace) - Speicher in /proc/kcore
ist nicht das gleiche wie der Speicher aus der Perspektive des Prozesses in /proc/pid/mem
- so Um nach dem Speicher des Prozesses in /proc/kcore
zu suchen, müsste man herausfinden, wie der Speicher des Prozesses in Kernel-Speicher abgebildet wird (viele unordentliche Dinge und zeitraubend) Also um den Prozessspeicher zu bekommen, zuerst lesen, welche Regionen von /proc/pid/maps
ist erlaubt Lesen/Schreiben von/nach und dann dump-copy die Regionen von /proc/pid/mem
. Das Skript unten erstellt alle schreibbaren Bereiche (Quelle: https://unix.stackexchange.com/questions/6301/how-do-i-read-from-proc-pid-mem-under-linux). BEARBEITEN: Das überarbeitete funktionierende Python-Skript wird in eine eigene Antwort verschoben, so dass es von der Frage getrennt kommentiert werden kann.
AFAIK, '/ proc/kcore' ist die Kernel Speicherplatz. Vielleicht passt '/ proc//mem' besser zu dem, was Sie erreichen möchten? –
twalberg
Warum fragst du und was genau willst du erreichen ??? Haben Sie den Fall in Betracht gezogen, in dem Überwachungs- und Überwachungsprozesse auf unterschiedlichen Prozessorkernen laufen, also gleichzeitig laufen (und ihren Adressraum "zufällig" anordnen)? –
Der Python-Code wird nicht ausgeführt. Alles, was ich bekomme, ist ein Fehler: 'IndentionError: erwartet einen eingerückten Block'' in Zeile 5. :( – zrajm