No estoy seguro de cómo volcar toda la memoria en un archivo sin hacer esto repetidamente (si alguien conoce una forma automatizada de hacer que gdb haga esto, hágamelo saber), pero lo siguiente funciona para cualquier lote de memoria, suponiendo que sepa el pid:
¡Increíble! Solo lo usé para descubrir qué script estaba ejecutando una misteriosa instancia de bash.
Tobia
¿Por qué solo estás buscando y volcando rangos con rw-ppermisos?
mxmlnkn
@mxmlnkn Eso es data ( rw-p), los otros rangos son para código ( r-xp). Si desea un volcado de ambos, entonces continúe e intercambie greppor ej cat.
A. Nilsson
39
tratar
gcore $pid
donde $pides 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 algo de memoria puede no ser legible, pero es lo suficientemente bueno ... tenga en cuenta también que puede crear archivos grandes, acabo de crear un archivo de 2GB de esa manera ...
Eso no es suficiente, leer otro proceso necesita una combinación de / proc / <pid> / {mem, * maps}, ptrace y algo de manejo de la señal para evitar colgar el proceso de destino.
Entonces, por lo que entiendo, la idea detrás del volcado del limpiador es que solo los archivos en memoria tienen un tamaño adjunto a la región de memoria en contraste con la memoria de la aplicación real, que tiene un tamaño 0 (ya que el tamaño realmente utilizado es desconocido por el OS).
mxmlnkn
Un problema que tengo con este script es que el tamaño de bloque de 1 conduce a un ancho de banda de inaceptablemente lento ~ 30kB / s en comparación con el uso de un tamaño de bloque igual al tamaño de página (4096 para mí) para el que obtengo ~ 100MB / s. Ver aquí . getconf PAGESIZEse usa para obtener el tamaño de página y luego las direcciones y los recuentos se dividen por él.
mxmlnkn
1
Herramienta para volcar el proceso a la salida estándar, pcat / memdump:
Este está obsoleto (eliminado a solicitud del responsable del mantenimiento); Instalé el paquete anterior de todos modos y falló con "Error de entrada / salida; ¿usaste GCC con los archivos de encabezado de otra máquina?".
Tobu
0
Ahora puede usar procdump de la suite SysInternals en Linux:
Si desea volcar un segmento de memoria separado del proceso en ejecución sin crear un archivo central enorme (digamos con gcore), puede usar una pequeña herramienta desde aquí . También hay una línea en README si desea volcar todos los segmentos legibles en archivos separados.
/proc/$pid/mem
.Respuestas:
No estoy seguro de cómo volcar toda la memoria en un archivo sin hacer esto repetidamente (si alguien conoce una forma automatizada de hacer que gdb haga esto, hágamelo saber), pero lo siguiente funciona para cualquier lote de memoria, suponiendo que sepa el pid:
Esto estará en el formato (ejemplo):
Elija un lote de memoria (por ejemplo, 00621000-00622000), luego use gdb como raíz para adjuntar al proceso y volcar esa memoria:
Luego analice / root / output con el comando de cadenas, menos quiere el PuTTY en toda su pantalla.
fuente
Hice 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
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
fuente
rw-p
permisos?rw-p
), los otros rangos son para código (r-xp
). Si desea un volcado de ambos, entonces continúe e intercambiegrep
por ejcat
.tratar
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 algo de memoria puede no ser legible, pero es lo suficientemente bueno ... tenga en cuenta también que puede crear archivos grandes, acabo de crear un archivo de 2GB de esa manera ...
fuente
gcore
volcando un archivo escaso?man proc dice:
Puede que esto te ayude
fuente
Hice mi propio programa para volcar toda la memoria del proceso también, está en C para que pueda compilarse en Android, que es lo que necesitaba.
También puede especificar la dirección IP y el puerto tcp. Código fuente aquí .
fuente
Solución pura de bash:
Uso: PID procdump
para un vertedero más limpio:
fuente
getconf PAGESIZE
se usa para obtener el tamaño de página y luego las direcciones y los recuentos se dividen por él.Herramienta para volcar el proceso a la salida estándar, pcat / memdump:
fuente
Ahora puede usar procdump de la suite SysInternals en Linux:
https://github.com/Microsoft/ProcDump-for-Linux
fuente
Si desea volcar un segmento de memoria separado del proceso en ejecución sin crear un archivo central enorme (digamos con gcore), puede usar una pequeña herramienta desde aquí . También hay una línea en README si desea volcar todos los segmentos legibles en archivos separados.
fuente