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