GNU/Linux >> Tutoriales Linux >  >> Linux

Volcar la memoria de un proceso de Linux en un archivo

Solución 1:

Creé un script que realiza esta tarea.

La idea proviene de la respuesta de James Lawrie y esta publicación: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

poner esto en un archivo (por ejemplo, "dump-all-memory-of-pid.sh") y hacerlo ejecutable

uso:./dump-all-memory-of-pid.sh [pid]

La salida se imprime en archivos con los nombres:pid-startaddress-stopaddress.dump

Dependencias:gdb

Solución 2:

No estoy seguro de cómo volcar toda la memoria en un archivo sin hacer esto repetidamente (si alguien conoce una forma automática de hacer que gdb haga esto, hágamelo saber), pero lo siguiente funciona para cualquier lote de memoria, suponiendo que sepa el pid:

$ cat /proc/[pid]/maps

Esto tendrá el formato (ejemplo):

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

Elija un lote de memoria (por ejemplo, 00621000-00622000), luego use gdb como raíz para adjuntar al proceso y volcar esa memoria:

$ gdb --pid [pid]
(gdb) dump memory /root/output 0x00621000 0x00622000

Luego analice /root/output con el comando strings, menos quiere que la PuTTY esté en toda su pantalla.

Solución 3:

prueba

    gcore $pid

donde $pid es el número real del pid; para más información ver:info gcore

puede tomar algún tiempo para que ocurra el volcado, y parte de la memoria puede no ser legible, pero es lo suficientemente buena... tenga en cuenta también que puede crear archivos grandes, acabo de crear un archivo de 2GB de esa manera..

Solución 4:

Solución bash pura:

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

Uso:procdump PID

para un filtro de volcado más limpio fuera *.so bibliotecas compartidas mapeadas en memoria y rangos de memoria vacíos:

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

Solución 5:

hombre proc dice:

/proc/[pid]/memEste archivo se puede usar para acceder a las páginas de la memoria de un proceso a través de open(2), read(2) y lseek(2).

Tal vez te pueda ayudar


Linux
  1. Uso de memoria de Linux

  2. Linux – ¿Todo es un archivo?

  3. ¿Número máximo de subprocesos por proceso en Linux?

  4. ¿Recuperar el uso de la CPU y el uso de la memoria de un solo proceso en Linux?

  5. Limitar el uso de memoria/CPU de proceso en Linux

Cómo mover un archivo en Linux

Live OS:eliminación segura de archivos

Limite el uso de memoria para un solo proceso de Linux

Memoria inactiva de Linux

¿Qué asesinos de procesos tiene Linux?

¿Cómo se informa el uso de la memoria en Linux?