web-dev-qa-db-fra.com

Vider la mémoire d'un processus Linux dans un fichier

Est-il possible de vider la mémoire actuelle allouée à un processus (par PID) dans un fichier? Ou le lire en quelque sorte?

59
Fragsworth

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.

49
James L

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

53
A. Nilsson

essayer

    gcore $pid

$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 ..

40
Aquarius Power

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 )
)
4
Zibri

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

3
Dom

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 .

3
Tal Aloni

Outil pour vider le processus vers la sortie standard, pcat/memdump:

1
Michael Springer

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.

0
Nopius

Vous pouvez maintenant utiliser procdump depuis Sysinternals Suite sous Linux:

https://github.com/Microsoft/ProcDump-for-Linux

0
makumo