Nichts, was ich versucht habe, würde dies beheben (beide Compiler, beide Debugger usw.). Nach dem Upgrade von XCode für das iOS 5-Update schienen keine Stack-Traces zu funktionieren.
Ich habe jedoch eine effektive Problemumgehung gefunden - das Erstellen eines eigenen Ausnahmebehandlers (was auch aus anderen Gründen nützlich ist). Erstellen Sie zunächst eine Funktion, die den Fehler behandelt und an die Konsole ausgibt (sowie alles, was Sie sonst noch damit tun möchten):
void uncaughtExceptionHandler(NSException *exception) {
NSLog(@"CRASH: %@", exception);
NSLog(@"Stack Trace: %@", [exception callStackSymbols]);
// Internal error reporting
}
Fügen Sie als Nächstes den Ausnahmebehandler zu Ihrem App-Delegaten hinzu:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
// Normal launch stuff
}
Das ist es!
Wenn dies nicht funktioniert, gibt es nur zwei mögliche Gründe :
- Etwas überschreibt Ihren
NSSetUncaughtExceptionHandler
Anruf (es kann nur einen Handler für Ihre gesamte App geben). Beispielsweise setzen einige Bibliotheken von Drittanbietern ihren eigenen uncaughtExceptionHandler. Versuchen Sie also, es am ENDE Ihrer didFinishLaunchingWithOptions
Funktion einzustellen (oder Bibliotheken von Drittanbietern selektiv zu deaktivieren). Oder noch besser, setzen Sie einen symbolischen Haltepunkt, NSSetUncaughtExceptionHandler
um schnell zu sehen, wer ihn anruft. Möglicherweise möchten Sie Ihre aktuelle Version ändern, anstatt eine weitere hinzuzufügen.
- Sie stoßen tatsächlich nicht auf eine Ausnahme (zum Beispiel
EXC_BAD_ACCESS
ist dies keine Ausnahme; siehe die Kommentare von @Erik B unten)
uncaughtExceptionHandler
Routine wird nie aufgerufen.Es gibt eine nützliche Option zum Hinzufügen eines Ausnahme-Haltepunkts (mit dem + am unteren Rand des Haltepunkt-Navigators). Dies wird bei jeder Ausnahme unterbrochen (oder Sie können Bedingungen festlegen). Ich weiß nicht, ob diese Auswahl in 4.2 neu ist oder ob ich erst endlich bemerkt habe, dass sie versucht hat, das Problem der fehlenden Symbole zu umgehen.
Sobald Sie diesen Haltepunkt erreicht haben, können Sie mit dem Debug-Navigator wie gewohnt im Aufrufstapel navigieren, Variablen untersuchen usw.
Wenn Sie einen symbolisierten Aufrufstapel wünschen, der zum Kopieren / Einfügen oder dergleichen geeignet ist, funktioniert gdb backtrace von dort aus einwandfrei:
(etc)
quelle
Es gibt eine neue Funktion im Debugger. Sie können einen Haltepunkt festlegen, wenn eine Ausnahme ausgelöst wird, und die Ausführung genau dort stoppen, wie es früher bei 4.0 der Fall war.
Fügen Sie im "Breakpoint Navigator" einen "Exception Breakpoint" hinzu und drücken Sie einfach "Done" im Options-Popup.
Das ist alles!
PS: In einigen Fällen wäre es besser, nur für Objective-C-Ausnahmen zu brechen.
quelle
Hier ist eine weitere Lösung, die nicht so elegant wie zuvor ist. Wenn Sie jedoch keine Ausnahme-Haltepunkte oder Handler hinzugefügt haben, kann dies nur ein Weg sein.
Wenn die App abstürzt und Sie Ihren rohen First-Throw-Call-Stack (in Hex-Zahlen) erhalten, geben Sie Folgendes in die Xcode-Konsole ein
info line *hex
(Stern- und0x
Hex-Spezifizierer nicht vergessen ), zum Beispiel:Wenn Sie lldb verwenden , können Sie eingeben
image lookup -a hex
(in dieser Situation ohne Stern), und Sie erhalten eine ähnliche Ausgabe.Mit dieser Methode können Sie vom oberen Rand des Wurfstapels (es werden ungefähr 5-7 Systemausnahme-Propagatoren vorhanden sein) zu Ihrer Funktion wechseln, die einen Absturz verursacht hat, und die genaue Datei und Codezeile bestimmen.
Für einen ähnlichen Effekt können Sie auch das Dienstprogramm atos im Terminal verwenden. Geben Sie einfach Folgendes ein:
und Sie erhalten eine symbolisierte Stapelverfolgung (zumindest für Funktionen, für die Sie Debug-Symbole haben). Diese Methode ist vorzuziehen, da Sie nicht für jeden Adressaufruf
info line
nur Adressen aus der Konsolenausgabe kopieren und in das Terminal einfügen müssen.quelle
Sie können einen Ausnahme-Haltepunkt hinzufügen (mit dem + am unteren Rand des Haltepunkt-Navigators) und die Aktion hinzufügen
bt
(klicken Sie auf die Schaltfläche Aktion hinzufügen , wählen Sie Debugger-Befehl, geben Sie "bt" in das Textfeld ein). Dadurch wird die Stapelverfolgung angezeigt, sobald eine Ausnahme ausgelöst wird.quelle
Dies ist ein häufiges Problem, da in 4.2 keine Stapelspuren abgerufen werden. Sie können versuchen, zwischen LLDB und GDB zu wechseln, um bessere Ergebnisse zu erzielen.
Reichen Sie hier einen Fehlerbericht ein.
http://developer.apple.com/bugreporter/
BEARBEITEN:
Ich glaube, wenn Sie zu LLVM GCC 4.2 zurückkehren, werden Sie dies nicht sehen. Möglicherweise verlieren Sie jedoch die benötigten Funktionen.
quelle
Verwenden Sie diesen Code in Ihrer Hauptfunktion:
quelle
Geben Sie an der Eingabeaufforderung der Debug-Konsole von Xcode Folgendes ein:
Und es wird Ihnen so etwas zeigen wie:
quelle
Das Wiedereinschalten von 'Compile for Thumb' (Debug-Konfiguration) hat bei mir funktioniert.
quelle