2011-07-08 12 views
6

Mi aplicación de consola atrapa SIGINT para que pueda salir con gracia.¿Cómo puedo generar un SIGINT cuando uso XCode para depurar?

presionar CTRL +C dentro de XCode mientras que el programa se está depurando, sin embargo, no tiene ningún efecto.

Puedo encontrar el proceso y utilizar una ventana de terminal para enviar un SIGINT a mi proceso, sin embargo, espero que haya una solución más simple que pueda hacer dentro de XCode.

Respuesta

5

El botón pausa de la consola depurador realmente envía un SIGINT a su aplicación Si desea. hacer pasar el depurador la señal a su aplicación se puede hacer lo siguiente:

  1. Pulse el botón de pausa del depurador y esperar a que la consola de depuración para obtener el foco
  2. Tipo handle SIGINT pass y pulse ENTER
  3. Pulse el botón Continuar

Ahora volviendo a pulsar el botón de pausa de la consola de depuración de Xcode hará que el SIGINT golpeó su aplicación.

Si no desea que el depurador se detiene tan pronto como el SIGINT es apresado también puede que quiera añadir handle SIGINT nostop a la lista anterior.

+3

ya no funciona con XCode 6 que utiliza depurador llvm. – Lothar

+0

@Lothar He añadido una respuesta para Xcode 5 y superior: http://stackoverflow.com/a/36521995/1255551 – craig65535

1

Una de las soluciones al problema de trabajar con interrupciones es crear un MainMenu con un atajo CTRL-C que ejecute la rutina solicitada, o se envía un SIGINT, si realmente necesita el sig.

1

Una solución es utilizar los comandos UNIX kill o killall.

Si conoce el ID de proceso puede abrir la aplicación Terminal y escriba:

kill -SIGINT 415 

(donde 415 es el PID para este proceso)

O, tal vez más fácil, puede escribir

killall -SIGINT my_console_app 

(donde my_console_app es el nombre de su aplicación, es decir, el nombre del binario creado - no el paquete si está en uno)

Esto enviará la señal a todas las instancias de la aplicación, como sugiere el nombre killall, por lo que puede no ser apropiado. Puede ser que sea la pena comprobar si hay otros procesos con el mismo nombre en funcionamiento antes de hacer una killall (;

3

En Xcode 5+ (LLVM):

  1. Pausa el proceso

  2. Al (llvm) indicador, entre process signal SIGINT

  3. ejecución Reanudar

1

actualización para 2017/Xcod e 8: el comando adecuado (s) para informar LLDB de su intención para tratar las alarmas:

process handle SIGINT -s false 
process handle SIGINT -p true 

En mi experiencia, incluso con los comandos anteriores, la función pausa del depurador todavía interrumpirá la aplicación y el rendimiento de control para puntero de pila del depurador, sin embargo, un pkill -2 appname en el terminal activará su función de interrupción sin ninguna interacción con el depurador, por ejemplo:

void on_signal(int sig) { 
    is_interrupted = 1; 
} 

int main(int argc, const char * argv[]) { 
    signal(SIGINT, on_signal); 
    // ... do stuff 
} 
Cuestiones relacionadas