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