2010-07-27 10 views
8

Durante la lettura di/proc/$ PID/maps si ottengono le regioni di memoria mappate. C'è un modo per scaricare una di queste regioni?Memoria di dump di un processo

$ cat /proc/18448/maps 
...[snip]... 
0059e000-005b1000 r-xp 00000000 08:11 40   /usr/local/lib/libgstlightning.so.0.0.0 
005b1000-005b2000 r--p 00012000 08:11 40   /usr/local/lib/libgstlightning.so.0.0.0 
005b2000-005b3000 rw-p 00013000 08:11 40   /usr/local/lib/libgstlightning.so.0.0.0 
...[snip]... 

Grazie

risposta

10

Nah! Chiama il numero ptrace() con PTRACE ATTACH. Quindi apri /proc/<pid>/mem, cerca l'offset della regione e leggi la lunghezza della regione come indicato in /proc</pid>/maps.

Ecco uno program I wrote che lo fa in C. Ecco uno module I wrote che lo fa in Python (and the ptrace binding). Per il traguardo, un program that dumps all regions of a process to files.

Divertiti!

+0

Cool :) Grazie mille – mathk

+0

Grazie per il segno di spunta. Ho molta esperienza in questa roba: P –

5

È possibile allegare gdb al processo poi scaricano regione di memoria di lunghezza X parole che iniziano nella posizione L con questo: .

Allegare gdb quando si avvia il processo è semplice: gdb ./executable quindi run. Se hai bisogno di collegarti a un processo in esecuzione, avvia gdb e poi gdb attach pid dove pid è l'ID di processo che ti interessa.

+0

Grazie, :) Non ci ho pensato – mathk

+1

È possibile utilizzare un argomento della riga di comando per collegarsi a un processo in esecuzione: 'gdb -p '. –

+0

Buono a sapersi. Ho usato seriamente gdb solo per obiettivi remoti. – nmichaels

4

Utilizzando dd (1):

sudo dd if=/dev/mem bs=1 skip=$((16#0059e000 - 1)) \ 
     count=$((16#005b1000 - 16#0059e000 + 1)) | hexdump -C