User Tools

Site Tools


obtener_un_volcado_de_la_memoria_mapeada_por_un_proceso

This is an old revision of the document!


Volcado de la memoria usada por un proceso usando Bash

Esta función en bash hace un volcado mediante “dd” en “/proc/PID/maps” para obtener todo lo que el proceso tiene mapeado a memoria. Este archivo hace referencia a una parte de lo denominado memoria virtual (mmap), contiendo las regiones de memoria actualmente asignadas. Los campos de ese archivo son “address” ,“perms”, “offset”, “dev”, “inode” y “pathname”.

A continuación se muestra la función en bash para realizar el volcado de memoria de un proceso sin incluir las librerías compartidas o ficheros mapeados a disco. Para ello usamos las entradas del fichero maps con el valor de inodo “ 0 ”, que indica que no hay ningún inodo asociado a la región de memoria. A esa memoria sin inodo y por tanto sin ruta a fichero se denomina “anónima”. Una vez obtenidas las direcciones, se obtienen todas las regiones y mediante dd se extraen en el directorio donde se ejecute el comando. Los ficheros tendrán el prefijo del PID:mem_ y posteriormente la región de memoria y la extensión .bin. Para leer dichos ficheros binarios se puede usar xxd o el comando strings.

Volcado de memoria de un PID en concreto.

procdump()
( 
    cat /proc/$1/maps | 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 )
)
# Forma de uso.
procdump 3456

Volcado de memoria de múltiples PIDs usando su nombre (basado en pidof).

procdump()
(                                                                                  
for g in `pidof $1`
do
    cat /proc/${g[@]}/maps | grep " 0 " | awk '{print $1}' | ( IFS="-"
    while read a b; do
        dd if=/proc/${g[@]}/mem bs=$( getconf PAGESIZE ) iflag=skip_bytes,count_bytes skip=$(( 0x$a )) count=$(( 0x$b - 0x$a )) of="${g[@]}_mem_$a.bin"
    done )
done
)
# Forma de uso.
procdump mysqld

A diferencia del anterior ejemplo que se limita a un solo PID, esta variante es útil con aplicaciones que suelen tener varios procesos, como Apache, Nginx, PHP, etc.

pidof nginx
107537 107536 1007

ps aux| grep -i nginx
root        1007  0.0  0.4  23900  8852 ?        Ss   Jul07   0:00 nginx: master process /usr/bin/nginx -g pid /run/nginx.pid; error_log stderr;
http      107536  0.0  0.4  24140  9592 ?        S    Aug01   0:02 nginx: worker process
http      107537  0.0  0.5  24140 10364 ?        S    Aug01   1:17 nginx: worker process

Enlaces de interés: mostrar_memoria_real_utilizada_por_un_proceso

obtener_un_volcado_de_la_memoria_mapeada_por_un_proceso.1659642343.txt.gz · Last modified: 2022/08/04 21:45 by busindre