Est-il possible de vider la mémoire actuelle allouée pour un processus (par PID) dans un fichier? Ou le lire d'une manière ou d'une autre?
Est-il possible de vider la mémoire actuelle allouée pour un processus (par PID) dans un fichier? Ou le lire d'une manière ou d'une autre?
Réponses:
Je ne suis pas sûr de savoir comment vider toute la mémoire dans un fichier sans le faire plusieurs fois (si quelqu'un connaît un moyen automatisé d'obtenir que gdb le fasse, merci de me le faire savoir), mais les procédures suivantes fonctionnent pour tout lot de mémoire en supposant que vous le sachiez le pid:
$ cat /proc/[pid]/maps
Ce sera dans le 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 racine pour l'attacher au processus et videz 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 fait 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 ceci dans un fichier (par exemple "dump-all-memory-of-pid.sh") et le rendre exécutable
usage: ./dump-all-memory-of-pid.sh [pid]
La sortie est imprimée dans des fichiers avec les noms suivants: pid-startaddress-stopaddress.dump
Les dépendances: gdb
rw-p
autorisations?
rw-p
), les autres plages sont pour code ( r-xp
). Si vous voulez un dump des deux, alors allez-y et échangez grep
par exemple cat
.
essayer
gcore $pid
où $pid
est le nombre actuel du pid; pour plus d'informations, voir:info gcore
le dump peut prendre un peu de temps, et une partie de la mémoire peut ne pas être lisible, mais est assez bonne ... sachez aussi qu'il peut créer de gros fichiers, je viens de créer un fichier de 2 Go de cette façon ..
gcore
dumping est-il un fichier fragmenté?
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
Solution pure bash:
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 )
}
Utilisation: PID procdump
pour un dépotoir plus propre:
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
est utilisé pour obtenir la taille de la page et ensuite les adresses et les comptes sont divisés par elle.
Outil de sauvegarde du processus vers la sortie standard, pcat / memdump:
Vous pouvez maintenant utiliser procdump de la suite SysInternals sous Linux:
Si vous souhaitez vider un segment de mémoire distinct du processus en cours sans créer un fichier core énorme (par exemple avec gcore), vous pouvez utiliser un petit outil à partir d' ici . Il existe également une ligne dans README si vous souhaitez transférer tous les segments lisibles dans des fichiers séparés.
/proc/$pid/mem
.