È possibile scaricare in un file la memoria corrente allocata per un processo (tramite PID)? O leggerlo in qualche modo?
È possibile scaricare in un file la memoria corrente allocata per un processo (tramite PID)? O leggerlo in qualche modo?
Risposte:
Non sono sicuro di come scaricare tutta la memoria su un file senza farlo ripetutamente (se qualcuno conosce un modo automatizzato per fare in modo che gdb lo faccia, per favore fatemelo sapere), ma quanto segue funziona per ogni singolo lotto di memoria supponendo che lo sappiate 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 scaricare quella memoria:
$ gdb --pid [pid]
(gdb) dump memory /root/output 0x00621000 0x00622000
Quindi analizza / root / output con il comando stringhe, meno vuoi PuTTY su tutto lo schermo.
Ho realizzato una sceneggiatura che compie 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
mettilo in un file (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
rw-p
autorizzazioni?
rw-p
), gli altri intervalli sono per code ( r-xp
). Se vuoi una discarica di entrambi, vai avanti e scambia grep
per es cat
.
provare
gcore $pid
dove $pid
è il numero effettivo del pid; per maggiori informazioni vedi:info gcore
potrebbe volerci un po 'di tempo prima che si verifichi il dump e un po' di memoria potrebbe non essere leggibile, ma è abbastanza buona ... attenzione anche che può creare file di grandi dimensioni, ho appena creato un file da 2 GB in quel modo ..
gcore
dumping è un file sparso?
man proc dice:
/ proc / [pid] / mem Questo file può essere utilizzato per accedere alle pagine della memoria di un processo tramite open (2), read (2) e lseek (2).
Forse ti può aiutare
Soluzione bash pura:
procdump ()
{
cat /proc/$1/maps | grep "rw-p" | awk '{print $1}' | ( IFS="-"
while read a b; do
count=$(( bd-ad ))
ad=$(printf "%llu" "0x$a")
bd=$(printf "%llu" "0x$b")
dd if=/proc/$1/mem bs=1 skip=$ad count=$count of=$1_mem_$a.bin
done )
}
Utilizzo: procdump PID
per una discarica più pulita:
procdump ()
{
cat /proc/$1/maps | grep -Fv ".so" | grep " 0 " | awk '{print $1}' | ( IFS="-"
while read a b; do
ad=$(printf "%llu" "0x$a")
bd=$(printf "%llu" "0x$b")
dd if=/proc/$1/mem bs=1 skip=$ad count=$(( bd-ad )) of=$1_mem_$a.bin
done )
}
getconf PAGESIZE
viene utilizzato per ottenere le dimensioni della pagina e quindi gli indirizzi e i conteggi vengono divisi per essa.
Strumento per scaricare il processo su output standard, pcat / memdump:
Ora puoi usare procdump dalla suite SysInternals su Linux:
/proc/$pid/mem
.