Quiero un programa C para producir un volcado de núcleo bajo ciertas circunstancias. Este es un programa que se ejecuta en un entorno de producción y no se puede detener y reiniciar fácilmente para ajustar otros tipos de código de depuración. Además, como está en un entorno de producción, no quiero llamar a abort(). Los problemas investigados no se replican fácilmente en un entorno que no sea de producción. Lo que me gustaría es que el programa, cuando detecta ciertos problemas, produzca un volcado del núcleo por sí mismo, preferiblemente con suficiente información para renombrar el archivo, y luego continúe.¿Cómo puede un programa C producir un volcado de núcleo sin terminar?
Respuesta
void create_dump(void)
{
if(!fork()) {
// Crash the app in your favorite way here
abort() || (*((void*)0) = 42);
}
}
Tenedor el proceso a continuación, tirar el niño - que te dan una instantánea cada vez que desee
El código fuente para producir un volcado del núcleo está en 'gcore', que es parte del paquete gdb.
Además, el Sol tiene gcore.
Además, debe tener un proceso separado ejecutando el volcado del núcleo, ya que el proceso actual debe suspenderse. Encontrarás los detalles en la fuente de Gcore, o simplemente puedes ejecutar el gcore de tu plataforma con tu proceso como objetivo.
Sun describe cómo obtener un archivo de núcleo en Solaris, HP-UX, Redhat y Windows here.
Solaris tiene el programa gcore. HP-UX puede tenerlo. De lo contrario, use gdb y su comando gcore. Windows tiene win-dbg-root \ tlist.exe y win-dbg-root \ adplus.vbs
¿Realmente quiere un núcleo, o simplemente un stacktrace? Si todo lo que quieres es stacktrace, puedes echar un vistazo al opensource here e intentar integrar el código desde allí, o simplemente llamar desde la línea de comandos es suficiente.
Creo que algún código en el proyecto gdb también podría ser útil.
Otra cosa que debería hacer es utilizar gdb para adjuntarlo a un proceso en ejecución.
$ gdb /path/to/exec 1234 # 1234 is the pid of the running process
Nota: la pregunta acerca de la ejecución del BGF desde la propia aplicación: http://stackoverflow.com/questions/3151779/how-its-better-to-invoke-gdb-from- program-to-print-its-stacktrace –
Otra forma podría ser el uso de la biblioteca Google Coredumper. Esto crea un resultado similar a la técnica fork + abort, pero se reproduce mejor con aplicaciones multiproceso (suspende todos los hilos durante un tiempo antes de bifurcar para que no ensucien al niño).
Ejemplo:
#include <google/coredumper.h> ... WriteCoreDump('core.myprogram'); /* Keep going, we generated a core file, * but we didn't crash. */
- 1. Cómo causar un volcado del núcleo en C/C++
- 2. aborto infinito() en un backrace de un volcado del núcleo del programa C++
- 3. ¿Puede GDB imprimir el tamaño de las estructuras desde un volcado de núcleo de un programa C?
- 4. Terminar un programa python multihilo
- 5. Volcado del núcleo en Linux
- 6. Error de segmentación (núcleo volcado)
- 7. ¿Cómo puedo terminar ncurses sin finalizar el programa C++?
- 8. Java tiene un núcleo 39G volcado
- 9. ¿Cómo analizar el archivo de volcado del núcleo de un programa con gdb?
- 10. Cómo leer fotogramas de un volcado de memoria (sin GDB)?
- 11. Cómo habilitar el volcado del núcleo en mi programa C++ de Linux
- 12. ¿Tiene ActionScript un equivalente a un "volcado del núcleo"?
- 13. Cómo generar el archivo de volcado del núcleo en Ubuntu
- 14. Formato de archivo de volcado de núcleo
- 15. Cómo analizar el volcado del núcleo
- 16. ¿Por qué se generan archivos de volcado de núcleo?
- 17. ¿Puede un programa C manejar excepciones C++?
- 18. Análisis de volcado del núcleo utilizando gdb
- 19. obteniendo stacktrace del volcado del núcleo
- 20. ¿Cómo creo un programa C# sin una GUI?
- 21. Cómo obtengo un volcado de emergencia
- 22. Generar volcado del núcleo en Android
- 23. ¿Es posible obtener un volcado del núcleo de un proceso en ejecución y su tabla de símbolos?
- 24. Terminar el programa pulsando CTRL + C en el BGF
- 25. por proceso directorio de volcado del núcleo configurable
- 26. ¿Se puede ejecutar un programa python en una computadora sin Python? ¿Qué hay de C/C++?
- 27. ¿Cómo hacer un buen uso del seguimiento de la pila (desde el núcleo o el volcado del núcleo)?
- 28. ¿Cómo analizar la información de un volcado de núcleo de Java?
- 29. Cómo terminar con un puntero a 0xCCCCCCCC
- 30. OS X: ¿Genera volcado del núcleo sin que se reduzca el proceso?
Ooohh, eso es muy ingenioso - Siempre he tenido que subir (6) y reiniciar el proceso. – paxdiablo
Esto mata al padre. El niño devuelve 0 del tenedor(). –
¿Puedo utilizar este método para generar un volcado de núcleo al manejar una señal segfault una vez, pero no deseo terminar? Me gustaría escribir un programa de pantalla completa, y todavía estoy ponderando mis opciones, sobre cómo manejar posibles errores sin salir de mi programa, si eso es posible. –