2009-01-10 12 views
7

Ich bekomme diese Meldung jedes Mal, wenn ich kompiliere mein Projekt:Was ist eine "Abort Trap" & wie debugge ich es?

RunIPhoneUnitTest.sh: line 92: 31389 Abort trap    "$TARGET_BUILD_DIR/$EXECUTABLE_PATH" -RegisterForSystemEvents 

Ich verstehe, ist ein Problem in meinem Code, aber dann stelle ich nicht, wie lösen oder es gefunden.

Das Merkwürdige ist, dass ich das mit diesem Anruf erhalten:

-- This is the interface 
@interface DbObject : NSObject { 
    NSInteger Id; 
    NSDate* timeStamp; 
} 

@property (nonatomic) NSInteger Id; 
@property (nonatomic, retain) NSDate *timeStamp; 
---- 
This fail with above error 
---- 
NSString * filter = [NSString stringWithFormat:"id = %@", ds.Id, nil]; 

ABER das Wird Sache ist, dass ich diese Zeile zu löschen, diese Methode und es noch bekommen! Macht mich verrückt.

Derzeit bin ich in löschen Code zu denken, bis kein Fehler & Start Hinzufügen es bekommen, aber frage mich, ob eine pragmatische Lösung existieren ...

Antwort

11

ein Abbruch Falle bedeutet normalerweise, dass Abbruch wurde irgendwo genannt. Dies geschieht höchstwahrscheinlich, weil der Kabelbaum-Code des Einheitentests eine Ausnahme auslöst, die er nicht erwartet und einfach durch Aufruf von abort (3) behandelt. Der Abbruch-Aufruf ist nicht sehr einfach zu debuggen, weil er keine Informationen darüber liefert, wer ihn aufgerufen hat oder warum, und gibt niemals eine SIGABRT zurück. Sie könnten einen neuen Handler für SIGABRT installieren und dort einen Haltepunkt platzieren und dann zumindest den aktuellen Call-Stack untersuchen ... aber lesen Sie den Rest, um zu erfahren, warum das überhaupt passiert.

Das Problem mit Ihrem Code oben ist jedoch, dass NSInteger kein Objekttyp ist, es ist eine regelmäßige primitive. Um Ihre Fehler zu korrigieren, ersetzen die fehlerhafte Zeile mit diesem:

NSString *filter = [NSString stringWithFormat:@"id = %lld", (long long)ds.Id]; 

Zuerst stringWithFormat nimmt ein NSString Objekt als Parameter, so dass Sie das verwenden müssen Zeichen ‚@‘ zu spezifizieren, dass der Stringliteral ist ein NSString. Dies ist sehr wichtig, da @"blah blah" tatsächlich in ein Objekt übersetzt wird. Der Aufruf, den Sie an stringWithFormat vornehmen, erwartet, dass die NSString-Objektinformation an dieser Speicheradresse resident ist, aber stattdessen eine Zeichenfolge erhält und höchstwahrscheinlich dort explodiert. Stellen Sie sicher, dass alle Ihre Zeichenfolgenliterale @"blah blah" sind, wo ein NSString-Typ erwartet wird und dass sie keine einfachen C-Zeichenfolgen sind.

Zweitens gibt das '@' Zeichen in der Formatzeichenfolge ein Objekt an. Da NSInteger kein Objekt ist, können Sie dieses Formatzeichen nicht verwenden. Verwenden Sie stattdessen% lld, um eine lange Long-Ganzzahl anzugeben. Schließlich müssen Sie die nil am Ende der Parameterliste nicht hinzufügen, wenn Sie stringWithFormat verwenden, da die Formatzeichenfolge selbst angibt, wie viele Parameter zu erwarten sind.

Der Grund, dass %lld statt nur %d verwendet wird, ist, dass NSInteger die Größe abhängig davon ändert, ob Sie für ein 32-Bit- oder 64-Bit-Ziel kompilieren. Durch die Förderung der NSInteger auf die long long Art und Verwendung der %lld Spezifizierer stellen Sie sicher, dass Sie keine Kürzungsprobleme in der Zukunft haben, wenn Sie für 64-Bit kompilieren und Ihr NSInteger-Wert mehr als 32 Bits zum Speichern benötigt.

Verwandte Themen