Traccia stack o ulteriori informazioni sull’eccezione non gestita in Xcode / iPhone

Scusa la mia ignoranza, ma qualcosa mi ha infastidito sul debugger Xcode quando eseguivo applicazioni iPhone in iPhone Simulator.

A volte, quando rovino qualcosa in Interface Builder, ottengo un’eccezione non gestita in fase di esecuzione e mi ritrovo a Xcode. L’unica cosa che vedo è una singola riga “eccezione non rilevata” o qualcosa del genere. Da quello che posso vedere, non ci sono informazioni aggiuntive, per non parlare di una traccia dello stack o di qualsiasi altra cosa che sia utile.

Sono stato in sviluppo in Visual Studio per l’ultimo decennio circa, e sono abituato a ottenere una bella traccia dello stack e completare le informazioni sulle eccezioni quando succede qualcosa del genere.

Sono sicuro che mi manca semplicemente qualcosa di molto ovvio … Speriamo …

    Se aggiungi due punti di interruzione, dovresti essere in grado di eseguire il debug di queste eccezioni. Per farlo, vai su Esegui | Mostra | Punti di interruzione e creare due punti di rottura globali (li faccio globalmente perché sono così utili in tutte le mie applicazioni). Il primo dovrebbe essere chiamato “objc_exception_throw” e la sua posizione dovrebbe essere “libobjc.A.dylib”. Il secondo dovrebbe essere “- [NSException raise]” e la sua posizione dovrebbe essere “CoreFoundation”.

    Ora, se si avvia il debug dell’applicazione con i punti di interruzione abilitati, è necessario interrompere il lancio di queste eccezioni. Dovresti quindi essere in grado di vedere la catena di eventi che ha portato all’eccezione all’interno del debugger.

    La mancanza di una traccia stack è di solito indicativa di un problema con LLDB (debugger). Adoro LLDB, ma quando si tratta di mostrare tracce dello stack e di rompere l’eccezione piuttosto che principale nelle app iOS, è un rompicapo ed è stato pubblicato per alcune versioni. Non ho idea del perché Apple non abbia ancora affrontato questo problema. Per risolvere il problema è necessario un processo in due fasi:

    1. Modifica lo schema corrente e nella scheda “Esegui” cambia il debugger da LLDB a GDB.
    2. Vai a https://developer.apple.com/bugreporter/ e segnala il bug in modo che Apple lo indirizzi.

    Ehi activa: per maggiori informazioni sulle eccezioni del runtime, dovresti essere in grado di aprire la console del debugger e vedere maggiori informazioni. Suppongo che tu l’abbia già fatto, ma per ogni evenienza: puoi accedervi selezionando Esegui -> Console dal menu. Non sono sicuro del motivo per cui non viene visualizzato automaticamente!

    Puoi racchiudere il tuo UIApplicationMain in un try / catch:

    int main(int argc, char *argv[]) { int retVal; NSAutoreleasePool * pool; @try { pool = [[NSAutoreleasePool alloc] init]; retVal = UIApplicationMain(argc, argv, nil, nil); } @catch(NSException* e) { NSLog(@"%@", e.reason); } @finally { [pool release]; } return retVal; } 

    Si dovrebbe anche cercare nell’impostazione di un gestore di assertion durante il debug: NSAssertionHandler .

    Aggiornamento: e anche il gestore delle eccezioni non gestito : NSSetUncaughtExceptionHandler