2011-02-07 6 views
7

Sto provando a compilare un semplice progetto maledizione con Xcode.
Il programma si compila bene con g ++ nel terminale con il flag -lcurses, e gira bene.
Xcode and Curses.h con terminale di apertura errore

Avviato creando uno strumento da riga di comando con tipo C++.
importato curses.h nel mio principale.
Nel Target "programma" Info -> Generale -> Biblioteche collegate, è stato aggiunto libCurses.dylib.

Compila bene ma la finestra del terminale non si apre.
Nella console di debug l'uscita è,

Programma caricato.
run
[Passaggio al processo 3424]
Terminale di apertura errore: sconosciuto.
In esecuzione ...

Posso andare a compilare la cartella e aprire il programma nel terminale ma esiste un modo per xcode di aprire il terminale?

Grazie per qualsiasi aiuto!

risposta

4

Non vi è alcun terminale da collegare nell'XE IDcode. Invece eseguire il programma da una shell (tramite applicazione Terminale)

./build/Debug/myprogram 

Se si desidera utilizzare il debugger IDE (che è solo gdb) è possibile collegare al processo. Pugno ottenere l'ID di processo,

gdb> attach mypid 

Per un metodo più conveniente, io cito Passaggio in Xcode: Mac OS X sviluppo

Aprire il gruppo eseguibili nelle Gruppi & file lista , selezionare l'applicazione, aprire una finestra Informazioni e nella scheda Debug, deselezionare Start eseguibile dopo l'avvio del debugger. Quando si è pronti per eseguire il debug, avviare il debugger , quindi avviare l'applicazione di destinazione nell'ambiente amichevole . Nella console gdb del debug, digitare allegare il mio programma e la sessione di debug è in corso.

7

Ho avuto lo stesso problema con il debug di ncurses in Xcode. Finalmente ho trovato un buon modo per me di gestire il debugging con Terminal.app che consente di eseguire il debug di ncurses.

Come sappiamo, per inizializzare e utilizzare ncurses è necessario eseguire la nostra applicazione nel terminale. Ma Xcode non apre il terminale quando premiamo il pulsante Esegui. Quindi, se richiediamo la variabile di ambiente TERM in codice, otterremo NULL. Questo è il motivo per cui l'applicazione si arresta su initscr().

Ma Xcode ci consente di impostare l'opzione di avvio per lo schema di esecuzione (Prodotto> Schema> Modifica schema ...> Esegui) per "Aspettami eseguibile per essere lanciato" al posto di default "automaticamente": Changing Launch option for Run scheme

Ora possiamo premere Esegui in Xcode e dopo il lancio la nostra applicazione manualmente nel Terminal. Quindi il debugger sarà allegato all'applicazione. Ci sono 2 problemi che:

  1. Se dire onestamente, debugger non verrà allegato sé senza azioni aggiuntive e salterà tutti i punti di interruzione. Ma possiamo gestirlo chiamando getchar() all'inizio del nostro programma. Ho risolto questo problema introducendo l'argomento riga di comando che indica che stiamo debugging nel terminale:

    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; 
        } 
    } 
    

    Quindi, siamo in grado di attivare la getchar() chiamata solo quando si desidera eseguire il debug all'interno Terminal.app

  2. Noi è necessario aprire Terminal e avviare manualmente l'applicazione ogni volta che viene premuto Esegui in Xcode. Questo è davvero fastidioso. Così, ho deciso di automatizzarlo tramite Pre-azioni nelle impostazioni dello schema Esegui. L'idea è di aprire Terminal ed eseguire la nostra applicazione al suo interno. Ma questa pre-azione dovrebbe lanciare l'applicazione AFTER Xcode eseguirà l'azione Esegui per far sì che "Aspetta l'esecuzione del file eseguibile" prima. Quindi abbiamo bisogno di un'attività di background non bloccante con un ritardo. Ciò può essere ottenuto seguendo comando di shell (& alla fine necessario per l'esecuzione in background):

    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' & 
    

    Non dimenticare di selezionare l'applicazione in "Fornire impostazioni di generazione da" lista per rendere accessibili importanti variabili d'ambiente $ TARGET_BUILD_DIR e $ PRODUCT_NAME: Provide build settings from

    Così, ora quando premiamo Run, Xcode attenderà eseguibile da allegare, terminal sarà aperto e la nostra applicazione sarà eseguita con la riga di comando opzione --debug-in-terminale e tutti i punti di interruzione verranno attivati.

    Abbastanza bello, ma sarà ancora meglio per chiudere questa finestra di Terminale, alla fine, perché genererà uno nuovo per ogni sessione di debug. Facciamolo in post-azioni per lo schema Run:

    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

    Questo comando semplicemente chiude finestra di terminale attiva, così forse questo post-azione non è necessaria se si prevede di utilizzare terminali per alcuni altri scopi durante la sessione di debug, perché è possibile chiudere casualmente alcune finestre importanti.

E, infine, un'idea di codice di ncurses sicuro, che controlla se possiamo usare 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

in Xcode 8 È possibile scegliere di eseguire all'interno del terminal, dal Programma Edit ... Opzioni pagina. XCode 8 screenshot

Anche se nei miei test rapidi non sembra funzionare altrettanto bene; a volte (non sempre) sembra 'perdere' l'oggetto del debug, o l'oggetto del debug non inizia mai, e pensa che sia ancora in esecuzione. Se tenti di uscire, Xcode rimane bloccato. Ho scoperto che se si trova e poi uccidere un processo chiamato lldb-rpc-server si può evitare di dover forzare l'uscita.

Più in dettaglio (in caso aiuta chiunque) ogni volta che il debuggee non si avvia, apro un terminale e digitare

ps x | grep lldb 

poi

kill 12345 

dove 12345 è l'ID di processo che ps mi da.

+0

Bella scoperta. Aveva lo stesso problema - in realtà non funziona, ma pulito per sapere che ci stanno lavorando. Dovevo anche uccidere il processo come hai detto dopo che non era riuscito a fare granché. – aardvarkk

+0

Contento che non sono solo io. Direi che circa il 20% delle volte devo uccidere il processo. Anche quando funziona, il debugger si attiva abbastanza spesso sui segnali (soprattutto SIGSTOP) che non mi sarei mai aspettato. Ecco in attesa di XCode 9 (!) –

Problemi correlati