Solution 1 :
J'ai créé un script qui accomplit cette tâche.
L'idée vient de la réponse de James Lawrie et de ce 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
mettez ceci dans un fichier (par exemple "dump-all-memory-of-pid.sh") et rendez-le exécutable
utilisation :./dump-all-memory-of-pid.sh [pid]
La sortie est imprimée dans des fichiers portant les noms :pid-startaddress-stopaddress.dump
Dépendances :gdb
Solution 2 :
Je ne sais pas comment vous videz toute la mémoire dans un fichier sans le faire à plusieurs reprises (si quelqu'un connaît un moyen automatisé de faire en sorte que gdb le fasse, faites-le moi savoir), mais ce qui suit fonctionne pour n'importe quel lot de mémoire en supposant que vous savez le pid :
$ cat /proc/[pid]/maps
Ce sera au format (exemple):
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
Choisissez un lot de mémoire (par exemple 00621000-00622000) puis utilisez gdb en tant que root pour vous attacher au processus et vider cette mémoire :
$ gdb --pid [pid]
(gdb) dump memory /root/output 0x00621000 0x00622000
Ensuite, analysez /root/output avec la commande strings, moins vous voulez le PuTTY partout sur votre écran.
Solution 3 :
essayez
gcore $pid
où $pid
est le numéro réel du pid ; pour plus d'informations, voir :info gcore
peut prendre un certain temps pour que le vidage se produise, et une partie de la mémoire peut ne pas être lisible, mais est assez bonne... sachez également que cela peut créer de gros fichiers, je viens de créer un fichier de 2 Go de cette façon...
Solution 4 :
Solution bash pure :
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 )
)
Utilisation :procdump PID
pour un filtre de vidage plus propre *.so
bibliothèques partagées mappées en mémoire et plages de mémoire vides :
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 )
)
Solution 5 :
man proc dit :
/proc/[pid]/memCe fichier peut être utilisé pour accéder aux pages de la mémoire d'un processus via open(2), read(2) et lseek(2).
Peut-être que cela peut vous aider