c++ linux eclipse netbeans sigint

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