Warum nimmt einfach beenden ein Programm zusammengestellt, für das iPhone?
Ich bin Debuggen einer stark assert()'ed iPhone-app (Xcode, Objektive-C++ - und device-simulator). In einigen Fällen, wird der assert-Fehler würde nur beenden Sie die app, anstatt zu brechen in den debugger als ich erwarten würde.
Machte ich eine Abhilfe durch die Umsetzung meiner eigenen kinda-geltend machen, um die Wirkung:
#define AssertLite(b) if(!(b)) {asm {int 3}}
(fluff weggelassen), aber ich Frage mich, ob jemals jemand auf diese. Ich konnte nicht feststellen, ein Muster ist, Wann gibt es Pause und Wann ist es beendet. Der code ist nicht eingefädelt; alle es tut, geschieht in Ereignis-Handlern.
Warum passiert das und wie mache ich Vanille assert() Verhalten sich wie in einem bedingten Haltepunkt verwendet wird, wie es sein sollte?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zuerst ab, da Sie arbeiten an eine iPhone-app, sollten Sie wahrscheinlich verwenden NSAssert() anstelle von dem Vanille-BSD assert-Funktion.
z.B.
NSAssert(the_object, @"NIL object encountered");
Den NSAssert makro wirft einen Objective-C exception (
NSInternalInconsistencyException
) falls die assertion fehlschlägt.Da es Ihr Ziel ist, zu brechen die Ausnahme, der nächste Schritt ist, um die Xcode-debugger Pause auf Objective-C-exceptions. Dies ist wahrscheinlich eine gute Sache zu tun sowieso.
In der Breakpoints-Fenster (Ausführen->Show->Haltepunkte im Menü), klicken Sie auf, wo es heißt "Doppelklicken Sie Auf Symbol", um das symbol
-[NSException raise]
Das Letzte, was, vorsichtig zu sein, aus, dass NSAsserts tun nicht kompilieren in einem release-build. Das bedeutet, dass Sie müssen bereit sein, behandeln Sie die exception in Ihrer Anwendung, oder erstellen Sie Ihre eigenen Makros, das tut kompilieren in release-builds.
Hier ist das makro habe ich kompilieren, aus Behauptungen, die in der runtime-code (beachten Sie, dass ich dann verwenden HMAssert in meinem code statt NSAssert):
Dies erfordert eine DEBUG-Präprozessor-makro definiert werden. Hier ist, wie Sie eingerichtet:
Zuerst, wenn Sie "Add Exception Breakpoint..." mit den Breakpoint-Navigator (⌘6), der debugger Stoppt auf NSAssert Ausfälle, so dass Sie Blick auf den Stapel und verstehen, was falsch gelaufen ist.
Sollten Sie die standard-NSAssert. Wenn Sie es richtig zu verwenden, es gibt nicht viele, die Sie manuell anlegen müssen-alles, Mike erwähnen, ist ähnlich wie die Standard-NSAssert Umsetzung.
Sollten Sie führen Sie release-Konfiguration mit NS_BLOCK_ASSERTIONS, die in Ihr vorkompilierte Header (Folgen Mike ' s Schritte), deaktivieren Behauptungen. Wenn Sie weitere Informationen benötigen, warum dies zu tun, überprüfen Sie heraus: http://myok12.wordpress.com/2010/10/10/to-use-or-not-to-use-assertions/
In Xcode 4 und dem neuen iOS, NSAssert kann tatsächlich nehmen Sie eine variable Liste von Parametern. Dies kann nützlich sein, melden einige Werte zusammen mit der assert. Der kompilieren-out geltend machen (siehe Antwort von Mike oben) könnte wie folgt definiert:
Da gibt es auch nicht mehr Ausführen → Zeigen → Breakpoints Menüpunkt. Sehen dieser Beitrag einrichten Xcode 4 zu brechen, auf eine Geltendmachung wie oben definiert.
Einmal sah ich ein anderes Verhalten von den assert () - Aufrufe einmal. Es wurde verursacht durch den compiler Abholung verschiedenen makro-Definitionen, die auf verschiedene Teile des build-Prozesses.
Einmal die include-Pfade wurden begradigt, Sie alle arbeiteten gleich.