Frage Dump den Speicher eines Linux-Prozesses in Datei


Ist es möglich, den aktuellen Speicher für einen Prozess (per PID) in eine Datei zu schreiben? Oder lies es irgendwie?


46
2017-08-24 17:44


Ursprung


Du kannst meine benutzen Proof-of-Concept-Skript das liest /proc/$pid/mem. - Gilles
Vielleicht möchten Sie auch lesen superuser.com/questions/236390/ ... und benutze stattdessen gcore. - Simon A. Eugster


Antworten:


Ich bin mir nicht sicher, wie Sie den gesamten Speicher in eine Datei ablegen, ohne dies wiederholt zu tun (falls jemand einen automatisierten Weg kennt, gdb dazu zu bekommen, lassen Sie es mich wissen), aber das Folgende funktioniert für einen Stapel Speicher, vorausgesetzt, Sie wissen es das Pid:

$ cat /proc/[pid]/maps

Dies wird im Format (Beispiel) sein:

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 Stapel Speicher aus (zum Beispiel 00621000-00622000) und verwenden Sie dann gdb als root, um den Prozess anzuhängen und den Speicher abzulegen:

$ gdb --pid [pid]
(gdb) dump memory /root/output 0x00621000 0x00622000

Dann analysieren Sie / root / output mit dem Befehl strings, weniger wollen Sie den PuTTY auf Ihrem Bildschirm.


40
2017-08-24 18:39



Gibt es eine Möglichkeit, dies in nur bash / sh ohne gdb zu tun? - Programming4life
@ Programmieren4Leben gcore (1) - SYS_V


Ich habe ein Skript erstellt, das diese Aufgabe erfüllt.

Die Idee kommt 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

lege dies in eine Datei (zB "dump-all-memory-of-pid.sh") und mach es ausführbar

Verwendungszweck: ./dump-all-memory-of-pid.sh [pid]

Die Ausgabe wird in Dateien mit folgenden Namen gedruckt: pid-startaddress-stopaddress.dump

Abhängigkeiten: gdb


41
2017-07-18 17:38



Genial! Habe es einfach benutzt, um herauszufinden, welches Skript eine mysteriöse Bash-Instanz war. - Tobia


Versuchen

    gcore $pid

woher $pid ist die tatsächliche Anzahl der PID; Für weitere Informationen siehe: info gcore

kann einige Zeit dauern, bis der Speicherauszug passiert, und etwas Speicher ist möglicherweise nicht lesbar, aber ist gut genug ... sei dir auch bewusst, dass es große Dateien erstellen kann, ich habe gerade eine 2GB-Datei auf diese Weise erstellt ..


34
2018-03-09 19:06



Ist gcore eine sparse Datei ablegen? - CMCDragonkai


man proc sagt:

/ proc / [pid] / mem                 Diese Datei kann verwendet werden, um auf die Seiten eines Prozesses zuzugreifen   Speicher durch öffnen (2), lesen (2) und lseek (2).

Vielleicht kann es dir helfen


3
2017-08-24 17:58



Das reicht nicht aus. Wenn Sie einen anderen Prozess lesen, benötigen Sie eine Kombination aus / proc / <pid> / {mem, * maps}, ptrace und etwas Signalhandling, um den Zielprozess nicht zu stören. - Tobu
@ Tobu Tatsächlich. Ich schrieb ein Proof-of-Concept-Skript. - Gilles


Ich habe mein eigenes Programm erstellt, um auch den gesamten Prozessspeicher zu löschen, es ist in C, so dass es auf Android kompiliert werden kann, was ich brauchte.

Sie können auch die IP-Adresse und den TCP-Port angeben. Quellcode Hier.


2
2017-12-27 14:55





Werkzeug, um den Prozess an die Standardausgabe, pcat / mddump, abzulegen:


1
2018-02-04 21:27



Dieser ist veraltet (entfernt auf Anforderung des Betreuers); Ich habe das alte Paket trotzdem installiert und es ist mit "Input / output error" fehlgeschlagen. Haben Sie GCC mit den Header-Dateien anderer Maschinen verwendet? ". - Tobu


Sie können jetzt procdump von der SysInternals-Suite unter Linux verwenden:

https://github.com/Microsoft/ProcDump-for-Linux 


0
2017-12-07 07:09