2011-02-07 17 views
7

Estoy intentando compilar un proyecto de maldición simple con Xcode.
El programa compila bien con g ++ en el terminal con la bandera -lcurses y funciona bien.
Xcode y Curses.h con error al abrir terminal

Empezado creando una herramienta de línea de comandos con tipo C++.
curses.h importados en mi main.
En el "Programa" Target Info -> General -> Linked Libraries, se ha agregado libCurses.dylib.

Compila bien, pero la ventana del terminal no se abre.
En la consola de depuración, la salida es

Programa cargado.
ejecutar
[Cambiar al proceso 3424]
Error al abrir la terminal: desconocido.
Ejecutando ...

Puedo ir a la carpeta de compilación y abrir el programa en el terminal, pero ¿hay alguna forma de que xcode abra el terminal?

¡Gracias por cualquier ayuda!

Respuesta

4

No hay terminal para conectar en el Xcode IDE. En lugar ejecutar el programa desde un shell (a través de la aplicación Terminal)

./build/Debug/myprogram 

Si desea utilizar el depurador IDE (que es sólo BGF) puede adjuntar al proceso. Puño obtener el identificador de proceso,

gdb> attach mypid 

Para un método más conveniente, voy a citar Paso en Xcode: desarrollo de Mac OS X

Abra el grupo ejecutables en los Grupos & archivos de lista , seleccione la aplicación, abra una ventana Información y en la pestaña Depuración, desmarque Inicie el ejecutable después de iniciar el depurador. Cuando esté listo para la depuración, inicie el depurador y luego inicie la aplicación de destino en su amigable entorno . En la consola del gdb del depurador, escriba adjunte myprogram y su sesión de depuración está en curso.

7

Tuve el mismo problema con la depuración de ncurses en Xcode. Finalmente, he encontrado una buena manera de gestionar la depuración con Terminal.app que permite depurar ncurses.

Como sabemos, para inicializar y usar ncurses necesitamos ejecutar nuestra aplicación en la terminal. Pero Xcode no abre la terminal cuando presionamos el botón de ejecución. Entonces, si solicitamos la variable de entorno TERM desde el código, obtendremos NULL. Esta es la razón por la cual la aplicación falla en initscr().

Pero Xcode nos permite configurar la opción Lanzar para el esquema Ejecutar (Producto> Esquema> Editar esquema ...> Ejecutar) para "Esperar a que se ejecute el ejecutable" en lugar del valor predeterminado "Automáticamente": Changing Launch option for Run scheme

Ahora podemos presionar Ejecutar en Xcode y luego iniciar nuestra aplicación manualmente en Terminal. Así que el depurador se adjuntará a la aplicación. Hay 2 problemas en que:

  1. Si decir honestamente, depurador no se adjuntará auto sin acciones adicionales y se saltará todos los puntos de interrupción. Pero podemos gestionarlo llamando a getchar() al comienzo de nuestro programa. He resuelto este problema mediante la introducción de argumentos de línea de comandos que indica que estamos en el terminal de depuración:

    for (int argi = 1; argi < argc; argi++) 
    { 
        if (strcmp(argv[argi], "--debug-in-terminal") == 0) 
        { 
         printf("Debugging in terminal enabled\n"); 
         getchar(); // Without this call debugging will be skipped 
         break; 
        } 
    } 
    

    Por lo tanto, podemos activar el getchar() llame sólo cuando queremos depurar el interior Terminal.app

  2. Nosotros Necesito abrir Terminal y ejecutar la aplicación manualmente cada vez que presiono Ejecutar en Xcode. Esto es realmente molesto Entonces, decidí automatizarlo a través de las acciones previas en el esquema de ejecución. La idea es abrir Terminal y ejecutar nuestra aplicación en él. Pero esta acción previa debería iniciar la aplicación DESPUÉS de que Xcode ejecute la acción Ejecutar para permitir que "Espere que se ejecute el ejecutable" primero. Entonces, necesitamos una tarea de fondo sin bloqueo con un retraso. Esto puede lograrse mediante la siguiente comando shell (& en el extremo necesario para ejecutar en segundo plano):

    osascript -e 'tell application "Terminal"' -e 'delay 0.5' -e "set currentTab to do script (\"$TARGET_BUILD_DIR/$PRODUCT_NAME --debug-in-terminal\")" -e 'end tell' & 
    

    No se olvide de seleccionar su aplicación en "Proporcionar configuración de generación de la" lista para hacer accesibles las variables de entorno importantes $ TARGET_BUILD_DIR y $ PRODUCT_NAME: Provide build settings from

    por lo tanto, ahora cuando pulsamos Ejecutar, Xcode esperará ejecutable para unir, se abrirá la terminal y nuestra aplicación se ejecutará con la línea de comandos opción --debug-en-terminal y todos los puntos de interrupción se activarán.

    Muy bien, pero será mejor cerrar esta ventana de Terminal al final, porque generará una nueva para cada sesión de depuración. Vamos a hacerlo en la post-acciones para el esquema de ejecución:

    osascript -e 'activate application "Terminal"' -e 'delay 0.5' -e 'tell application "System Events"' -e 'tell process "Terminal"' -e 'keystroke "w" using {command down}' -e 'end tell' -e 'end tell' 
    

    enter image description here

    Este comando simplemente cierra la ventana de terminal activa, así que quizás no es necesario este Post-acción si va a utilizar el terminal para algunos otros fines durante la sesión de depuración, porque puede cerrar una ventana importante accidentalmente.

Y, por último, una idea de código ncurses seguro, que comprueba si podemos usar ncurses o no:

#include <stdlib.h> 
#include <string.h> 
#include <ncurses.h> 


bool IsTerminalAvailable = false; // Check this global variable before ncurses calls 


int main(int argc, const char *argv[]) 
{ 
    for (int argi = 1; argi < argc; argi++) 
    { 
     if (strcmp(argv[argi], "--debug-in-terminal") == 0) 
     { 
      printf("Debugging in terminal enabled\n"); 
      getchar(); // Without this call debugging will be skipped 
      break; 
     } 
    } 

    char *term = getenv("TERM"); 

    IsTerminalAvailable = (term != NULL); 

    if (IsTerminalAvailable) 
     IsTerminalAvailable = (initscr() != NULL); 

    // Do some code here.... 

    if (IsTerminalAvailable) 
    { 
     printw("Press any key to exit..."); 
     refresh(); 

     getch(); 

     endwin(); 
    } 

    return 0; 
} 
2

en Xcode 8 se puede optar por ejecutar dentro de la terminal, desde el Esquema Editar ... Página de opciones. XCode 8 screenshot

Aunque en mi prueba rápida no parece funcionar muy bien; a veces (no siempre) parece 'perder' el depurador, o el depurador nunca se inicia, y cree que todavía se está ejecutando. Si intentas salir, Xcode se queda atascado. Descubrí que si encuentra y luego cancela un proceso llamado lldb-rpc-server, puede evitar forzar la salida.

De manera más detallada (en caso de que esto ayude a) cada vez que el depurador no se puede iniciar, abro un terminal y escriba

ps x | grep lldb 

continuación

kill 12345 

donde 12345 es el ID del proceso que ps me da

+0

Buen hallazgo. Tuve el mismo problema: en realidad no funciona, pero es bueno saber que están trabajando en ello. También tuvo que matar el proceso como lo mencionó después de que no pudo hacer gran cosa. – aardvarkk

+0

Me alegra que no sea solo yo. Supongo que aproximadamente el 20% del tiempo tengo que matar el proceso. Incluso cuando 'funciona', el depurador con frecuencia se activa con señales (SIGSTOP en su mayoría) que no habría esperado. Aquí está esperando XCode 9 (!) –

Cuestiones relacionadas