Est-il possible de vider la mémoire actuelle allouée à un processus (par PID) dans un fichier? Ou le lire en quelque sorte?
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é pour que gdb le fasse, veuillez me le faire savoir), mais ce qui suit fonctionne pour tout 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 sur tout votre écran.
J'ai créé un script qui accomplit cette tâche.
L'idée vient de la réponse de James Lawrie et de cet article: 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
mettre cela dans un fichier (par exemple "dump-all-memory-of-pid.sh") et le rendre 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
essayer
gcore $pid
où $pid
est le nombre réel du pid; pour plus d'informations, voir: info gcore
cela peut prendre un certain temps pour que le vidage se produise, et une certaine mémoire peut ne pas être lisible, mais elle est assez bonne ... sachez également qu'elle peut créer de gros fichiers, je viens de créer un fichier de 2 Go de cette façon ..
Solution pure bash:
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 vidange 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 )
)
l'homme proc dit:
/ proc/[pid]/mem Ce 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
J'ai également créé mon propre programme pour vider l'intégralité de la mémoire du processus, il est en C afin qu'il puisse être compilé de manière croisée avec Android, ce dont j'avais besoin.
Vous pouvez également spécifier l'adresse IP et le port TCP. Code source ici .
Outil pour vider le processus vers la sortie standard, pcat/memdump:
Si vous voulez vider un segment de mémoire séparé du processus en cours sans créer un énorme fichier core (par exemple avec gcore), vous pouvez utiliser un petit outil de ici . Il y a aussi une ligne dans README si vous souhaitez vider tous les segments lisibles dans des fichiers séparés.
Vous pouvez maintenant utiliser procdump depuis Sysinternals Suite sous Linux: