GNU/Linux >> Linux Esercitazione >  >> Linux

Scarica la memoria di un processo Linux su file

Soluzione 1:

Ho creato uno script che esegue questo compito.

L'idea nasce dalla risposta di James Lawrie e da questo post: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

inseriscilo in un file (ad es. "dump-all-memory-of-pid.sh") e rendilo eseguibile

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

L'output viene stampato su file con i nomi:pid-startaddress-stopaddress.dump

Dipendenze:gdb

Soluzione 2:

Non sono sicuro di come scarichi tutta la memoria in un file senza farlo ripetutamente (se qualcuno conosce un modo automatizzato per fare in modo che gdb lo faccia, per favore fammelo sapere), ma quanto segue funziona per qualsiasi batch di memoria supponendo che tu lo sappia il pid:

$ cat /proc/[pid]/maps

Questo sarà nel formato (esempio):

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

Scegli un batch di memoria (quindi ad esempio 00621000-00622000), quindi usa gdb come root per collegarti al processo e scarica quella memoria:

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

Quindi analizza /root/output con il comando strings, a meno che tu non voglia il PuTTY su tutto lo schermo.

Soluzione 3:

prova

    gcore $pid

dove $pid è il numero effettivo del pid; per maggiori informazioni vedi:info gcore

potrebbe volerci un po' di tempo prima che avvenga il dump, e un po' di memoria potrebbe non essere leggibile, ma è abbastanza buono... tieni anche presente che può creare file di grandi dimensioni, ho appena creato un file da 2 GB in questo modo..

Soluzione 4:

Soluzione bash pura:

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 )
)

Utilizzo:PID procdump

per un dump più pulito filtrare *.so librerie condivise mappate in memoria e intervalli di memoria vuoti:

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 )
)

Soluzione 5:

man proc dice :

/proc/[pid]/memQuesto file può essere utilizzato per accedere alle pagine della memoria di un processo tramite open(2), read(2) e lseek(2).

Forse può aiutarti


Linux
  1. Linux:tutto è un file?

  2. Numero massimo di thread per processo in Linux?

  3. Recuperare l'utilizzo della CPU e l'utilizzo della memoria di un singolo processo su Linux?

  4. Limitazione dell'utilizzo della memoria/CPU del processo su Linux

  5. Come posso creare un file dump di un processo in esecuzione in Linux?

Come spostare un file in Linux

Picco di utilizzo della memoria di un processo Linux/Unix

Riavvia il processo alla modifica del file in Linux

Come viene riportato l'utilizzo della memoria in Linux?

Utilizzo della memoria del processo grafico su Linux

Ubuntu Linux:elabora la memoria di scambio e l'utilizzo della memoria