2009-07-07 1 views
50

Entschuldigung meine Ignoranz, aber etwas hat mich über den Xcode Debugger beim Ausführen von iPhone-Anwendungen im iPhone Simulator nervt.Stack Trace oder mehr Informationen über unbehandelte Ausnahme in Xcode/iPhone

Manchmal, wenn ich etwas in Interface Builder zu vermasseln, bekomme ich eine unbehandelte Ausnahme zur Laufzeit und ich werde zurück zu Xcode geworfen. Das einzige, was ich sehe, ist eine einzige Zeile "Uncaught Exception" oder so ähnlich. Von dem, was ich sehen kann, gibt es keine zusätzlichen Informationen, geschweige denn einen Stack-Trace oder irgendetwas anderes, das nützlich ist.

Ich habe in Visual Studio für das letzte Jahrzehnt oder so entwickelt, und ich bin es gewohnt, einen schönen Stack-Trace zu erhalten und Info-Informationen zu vervollständigen, wenn so etwas passiert.

Ich bin sicher, dass ich einfach etwas ganz offensichtlich ... Hoffentlich fehlt bin ...

Antwort

70

Wenn Sie zwei Haltepunkte hinzufügen, sollten Sie diese Ausnahmen debuggen können. Wechseln Sie dazu zu Ausführen | Zeigen | Haltepunkte und erstelle zwei globale Haltepunkte (ich mache sie global, weil sie in all meinen Anwendungen so nützlich sind). Der erste sollte "objc_exception_throw" heißen und sein Speicherort sollte "libobjc.A.dylib" lauten. Der zweite sollte "- [NSException raise]" lauten und sein Speicherort sollte "CoreFoundation" sein.

Jetzt, wenn Sie mit der Debuggen Ihrer Anwendung mit aktivierten Haltepunkten beginnen, sollte es auf den Wurf dieser Ausnahmen brechen. Sie sollten dann in der Lage sein, die Kette von Ereignissen zu sehen, die innerhalb des Debuggers zu der Ausnahme geführt haben.

+1

Für die iPhone-Entwicklung brauchen Sie nur die erste. Dies ist der beste Weg, Details darüber zu erhalten, wo Ausnahmen auftreten. –

+0

Ja, ich denke, die Sekunde gilt nur für ältere Mac OS Versionen als Leopard. Es tut aber nicht weh, es herumzuhalten. –

+1

@Kendall Helmstetter Gelner @Philippe Leybaert Ist diese Antwort in xCode 4 noch gültig? Ich kann libobjc.A.dylib nicht finden. Ich meine, es ist mir auch nicht klar, wie man einen Breakpoint auf eine Datei anwendet (und nicht eine Codezeile?) – aneuryzm

1

Sie Ihre UIApplicationMain in einem try/catch wickeln kann:

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

Sie auch sehen sollte um einen Assertion-Handler während des Debuggens zu setzen: NSAssertionHandler.

Update: und auch die nicht behandelte Exception-Handler: NSSetUncaughtExceptionHandler

2

Hey activa - für weitere Informationen über Laufzeitausnahmen sollten Sie in der Lage sein, die Debugger-Konsole zu öffnen und weitere Informationen zu sehen. Ich nehme an, Sie haben das schon gemacht, aber nur für den Fall - Sie können es erreichen, indem Sie im Menü Run -> Console wählen. Ich bin mir nicht sicher, warum es nicht automatisch kommt!

+0

Hab das nicht gemacht, danke für die Köpfe. Ich lerne immer noch Xcode (es ist ein ziemlicher Sprung, wenn Sie praktisch jeden Tag in Ihrem Leben in Visual Studio leben) –

+0

Ja - es ist eine ziemliche Veränderung. Ich habe Eclipse schon seit Ewigkeiten benutzt und das Interface sieht im Vergleich total kahl aus! Nur wie 5 Knöpfe ?! Es hat jedoch viele versteckte Funktionen. Eclipse scheint mir jetzt so groß und klobig zu sein ... –

3

Das Fehlen eines Stack-Trace ist in der Regel Hinweis auf ein Problem mit LLDB (Debugger). Ich liebe LLDB, aber wenn es darum geht, Stack-Traces zu zeigen und eher die Exception als die Hauptsache in iOS-Apps zu durchbrechen, ist es ein Dorn im Auge und wurde jetzt für einige Releases verwendet. Keine Ahnung, warum Apple das noch nicht angesprochen hat. Um es zu beheben, ist ein Zwei-Schritt-Prozess:

  1. Bearbeiten Sie Ihr aktuelles Schema und unter der Registerkarte "Ausführen" ändern Sie den Debugger von LLDB zu GDB.
  2. Gehe zu https://developer.apple.com/bugreporter/ und melden Sie den Fehler, damit Apple es anspricht.