GNU/Linux >> Tutoriels Linux >  >> Linux

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

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

$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


Linux
  1. Linux - Limiter l'utilisation de la mémoire pour un seul processus Linux ?

  2. Linux - Tout est un fichier ?

  3. Nombre maximum de threads par processus sous Linux ?

  4. Récupérer l'utilisation du processeur et l'utilisation de la mémoire d'un seul processus sous Linux ?

  5. Limitation de l'utilisation de la mémoire de processus/du processeur sous Linux

Comment déplacer un fichier sous Linux

Redémarrer le processus lors du changement de fichier sous Linux

Live OS :suppression sécurisée des fichiers

Limiter l'utilisation de la mémoire pour un seul processus Linux

Comment placer/stocker un fichier en mémoire sous linux ?

Comment l'utilisation de la mémoire est-elle signalée sous Linux ?