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. Obtenemos 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 múltiples PIDs usando 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
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
Enlaces de interés: mostrar_memoria_real_utilizada_por_un_proceso