GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Den Speicher eines Linux-Prozesses in eine Datei ausgeben

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


Linux
  1. Linux-Speichernutzung

  2. Linux – Alles ist eine Datei?

  3. Maximale Anzahl von Threads pro Prozess in Linux?

  4. CPU-Auslastung und Speicherauslastung eines einzelnen Prozesses unter Linux abrufen?

  5. Live OS:Sicheres Löschen von Dateien

So verschieben Sie eine Datei unter Linux

Prozess bei Dateiänderung in Linux neu starten

Wie kann ich eine Dump-Datei eines laufenden Prozesses in Linux erstellen?

Protokollieren der RAM-Speicherobergrenze eines Linux-Prozesses

Wie platziere / speichere ich eine Datei im Speicher unter Linux?

Wie wird die Speichernutzung in Linux gemeldet?