Me gustaría forzar un volcado de memoria en una ubicación específica en mi aplicación C ++.
Sé que puedo hacerlo haciendo algo como:
int * crash = NULL;
*crash = 1;
Pero me gustaría saber si hay una forma más limpia.
Estoy usando Linux por cierto.
Respuestas:
El aumento de la señal número 6 (
SIGABRT
en Linux) es una forma de hacerlo (aunque tenga en cuenta que no se requiere que SIGABRT sea 6 en todas las implementaciones POSIX, por lo que es posible que desee usar elSIGABRT
valor en sí mismo si esto es algo diferente a quick'n 'código de depuración sucio).Llamar
abort()
también causará un volcado del núcleo, e incluso puede hacer esto sin terminar su proceso llamandofork()
seguido de soloabort()
en el niño; consulte esta respuesta para obtener más detalles.fuente
ulimit -c unlimited
de la respuesta de Suvesh Pratapa, me ayudó mucho para esta respuesta.Hace unos años, Google lanzó la biblioteca coredumper .
No es lo que estabas pidiendo, pero tal vez sea incluso mejor :)
fuente
Como se enumera en la página de manual de la señal , cualquier señal con la acción listada como 'núcleo' forzará un volcado de núcleo. Algunos ejemplos son:
Asegúrese de habilitar los volcados de memoria:
fuente
ulimit -c unlimited
ayudó.setrlimit(RLIMIT_CORE, &core_limits);
disponible a través de#include <sys/resource.h>
. Crea una estructura de tiporlimit
y luego establece los miembrosrlim_cur
yrlim_max
.fuente
abort()
directamente?Invocar
Relacionado, a veces le gustaría un seguimiento sin un volcado de núcleo real y permitir que el programa continúe ejecutándose: consulte las funciones glibc backtrace () y backtrace_symbols (): http://www.gnu.org/s/libc/ manual / html_node / Backtraces.html
fuente
Otra forma de generar un volcado de memoria:
Simplemente cree una nueva instancia de bash y elimínela con la señal especificada. El
$$
es el PID del shell. De lo contrario, está eliminando su bash actual y se cerrará la sesión, se cerrará o desconectará la terminal.fuente
bash -c 'kill -SIGSEGV $$'
.Puedes usar kill (2) para enviar la señal.
Entonces,
fuente
A veces, puede ser apropiado hacer algo como esto:
Un problema con este enfoque simple es que solo se realizará el coredumped en un hilo.
fuente
usa este enfoque donde quieras :)
fuente
fuente