c++ - Señales cuando se depura
linux eclipse (3)
Estoy desarrollando una aplicación (un servicio / daemon, realmente) en Linux en C ++ que necesita interconectarse con una pieza de hardware. Si mi programa no libera los recursos para esta pieza de hardware limpiamente al finalizar, entonces tengo que volver a cargar el controlador del dispositivo, un proceso que toma alrededor de 10 minutos y por razones obvias tener que esperar 10 minutos entre cada prueba del programa lo haría ser frustrante
Así que he usado la función sigaction()
para capturar un SIGINT (un ctrl-c) para que mi programa pueda cerrarse limpiamente cuando haya terminado con él. Cuando se ejecuta el programa desde la consola, funciona bien. Sin embargo, al depurar en Netbeans o Eclipse (he probado ambos), las cosas no funcionan.
- En Eclipse, si toco ctrl-c en la consola que proporciona, no parece registrar que se haya producido un SIGINT
- En Eclipse, si ejecuto el programa en modo de depuración y luego uso
kill -SIGINT <pid>
, el programa simplemente se rompe como si golpeara un punto de interrupción - En realidad, Netbeans parece darse cuenta de que se ha enviado una señal cuando presiono ctrl-c en la consola, y aparece un diálogo que me pregunta si quiero reenviarlo a la aplicación. Al hacer clic en "Adelante y continuar", parece que se rompe el programa y la aplicación no recibe la señal. También dice que puedo configurar esto en Debug -> Dbx configure, un elemento de menú que no existe
- En Netbeans, si ejecuto el programa en modo de depuración y luego uso
kill -SIGINT <pid>
, el comportamiento es el mismo que el anterior - Luego agregué un controlador SIGQUIT e intenté enviarlo a través de
kill
al depurar en Netbeans. Esta vez, no aparece ningún diálogo y el manejador de señal nunca se dispara.
Necesito alguna forma de cerrar mi aplicación limpiamente mientras estoy depurando. ¿Algunas ideas?
Solución simple ... Trate de usar las macros DEBUG para manejar su situación.
// Register the signal handler to stop service.
#ifdef _DEBUG
signal(SIGKILL, <your signal handler>);
#endif
Además, puedes intentar limpiar tu aplicación antes de salir.
Resultó que el problema no tenía nada que ver con Netbeans o Eclipse, sino con gdb.
gdb se puede configurar para manejar las señales en una variedad de formas. Si tu corres:
gdb
luego escribe:
info signals
Obtendrá una lista de señales y acciones de gdb sobre qué hacer si recibe esa señal:
Signal Stop Print Pass to program Description
SIGHUP Yes Yes Yes Hangup
SIGINT Yes Yes No Interrupt
SIGQUIT Yes Yes Yes Quit
SIGILL Yes Yes Yes Illegal instruction
SIGTRAP Yes Yes No Trace/breakpoint trap
etc ...
Mi trabajo temporal ha sido usar SIGALRM, que gdb predetermina no interrumpir y enviar al proceso. Sin embargo, también puede personalizar la configuración predeterminada de gdb creando un archivo .gdbinit donde puede configurar estos
Incluso esta publicación es antigua, espero que pueda ayudar a otros.
Para evitar que Eclipse capture Ctrl + C, puede configurar su gdb usando el archivo .gbdinit. Usted crea un .gdinit con este contenido
#we want Ctrl+C to be no break, pass to application and printed by the debugger
handle SIGINT nostop
handle SIGINT pass
handle SIGINT print
En su configuración de eclipse, puede definir dónde está su archivo .gdbinit para usar en su configuración de depuración