it-swarm.com.de

Speichern Sie den Speicher eines Linux-Prozesses in einer Datei

Ist es möglich, den aktuellen Speicher, der für einen Prozess (nach PID) zugewiesen wurde, in eine Datei zu kopieren? Oder irgendwie lesen?

59
Fragsworth

Ich bin nicht sicher, wie Sie den gesamten Speicher in eine Datei kopieren 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 beliebigen Speicherstapel, vorausgesetzt, Sie wissen es die 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 Speicherstapel aus (z. B. 00621000-00622000) und verwenden Sie dann gdb als Root, um eine Verbindung zum Prozess herzustellen und diesen Speicher zu sichern:

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

Analysieren Sie dann/root/output mit dem Befehl strings, weniger, als Sie möchten, dass PuTTY auf Ihrem gesamten Bildschirm angezeigt wird.

49
James L

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

Die Idee stammt aus 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

fügen Sie dies in eine Datei ein (z. B. "dump-all-memory-of-pid.sh") und machen Sie es ausführbar

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

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

Abhängigkeiten: gdb

53
A. Nilsson

versuchen

    gcore $pid

wo $pid ist die tatsächliche Nummer der PID; Weitere Informationen finden Sie unter: info gcore

es kann einige Zeit dauern, bis der Speicherauszug ausgeführt wird, und ein Teil des Speichers ist möglicherweise nicht lesbar, aber gut genug. Beachten Sie auch, dass große Dateien erstellt werden können. Ich habe gerade eine 2-GB-Datei auf diese Weise erstellt.

40
Aquarius Power

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 Filter heraus *.so 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 )
)
4
Zibri

mann Proc sagt:

/ proc/[pid]/mem Mit dieser Datei können Sie über open (2), read (2) und lseek (2) auf die Seiten des Speichers eines Prozesses zugreifen.

Vielleicht kann es dir helfen

3
Dom

Ich habe mein eigenes Programm erstellt, um auch den gesamten Prozessspeicher zu sichern. Es befindet sich in C, sodass es auf Android kompiliert werden kann, was ich brauchte.

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

3
Tal Aloni

Tool zum Speichern des Prozesses auf die Standardausgabe, pcat/memdump:

1

Wenn Sie ein separates Speichersegment des laufenden Prozesses sichern möchten, ohne eine große Kerndatei zu erstellen (z. B. mit gcore), können Sie ein kleines Tool von hier verwenden. Es gibt auch einen Einzeiler in README, wenn Sie alle lesbaren Segmente in separate Dateien speichern möchten.

0
Nopius

Sie können jetzt procdump von Sysinternals Suite unter Linux verwenden:

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

0
makumo