Frage

Wie lautet die Anweisung, um in Xcode einen Hardbreak zu verursachen?Unter Visual Studio könnte ich zum Beispiel „_asm int 3“ oder „DebugBreak()“ ausführen.Bei einigen GCC-Implementierungen ist es asm("break 0") oder asm("trap").

Ich habe unter Xcode verschiedene Kombinationen ausprobiert, ohne Erfolg.(Inline-Assembler funktioniert einwandfrei, es handelt sich also nicht um ein Syntaxproblem).

Als Referenz gilt dies für ein Assert-Makro.Ich möchte die Definitionen in „assert.h“ nicht verwenden, sowohl aus Gründen der Portabilität als auch, weil sie in der von XCode bereitgestellten Version anscheinend einen abort() ausführen.


John – Super, Prost.Als Referenz ist die int 3-Syntax diejenige, die für Intel-Macs und iPhone erforderlich ist.


Chris – Vielen Dank für Ihren Kommentar, aber es gibt viele Gründe, die Standardfunktion „asset()“ für Codebasen zu vermeiden, die auf verschiedene Plattformen portiert wurden.Wenn Sie sich die Mühe gemacht haben, Ihre eigene Behauptung zu erstellen, liegt das normalerweise daran, dass Sie über zusätzliche Funktionen (Protokollierung, Stapelabwicklung, Benutzerinteraktion) verfügen, die Sie beibehalten möchten.

Ihr Vorschlag, den Hander durch eine Implementierung von „__assert“ oder ähnlichem zu ersetzen, wird nicht übertragbar sein.Das standardmäßige „assert“ ist normalerweise ein Makro und während es auf dem Mac möglicherweise __assert zugeordnet werden kann, ist dies auf anderen Plattformen nicht der Fall.

War es hilfreich?

Lösung

http://developer.apple.com/documentation/DeveloperTools/Conceptual/XcodeProjectManagement/090_Running_Programs/chapter_11_section_3.html

asm {trap}            ; Halts a program running on PPC32 or PPC64.

__asm {int 3}         ; Halts a program running on IA-32.

Andere Tipps

Sie können einfach einen Anruf einfügen Debugger() – Dadurch wird Ihre App im Debugger gestoppt (wenn sie unter dem Debugger ausgeführt wird) oder mit einer Ausnahme angehalten, wenn dies nicht der Fall ist.

Auch, nicht meiden assert() aus „Portabilitätsgründen“ – Portabilität ist der Grund, warum es sie gibt!Es ist Teil von Standard C und Sie finden es überall dort, wo Sie einen C-Compiler finden.Was Sie wirklich tun möchten, ist, etwas Neues zu definieren Assertion-Handler Dadurch wird ein Debugger unterbrochen, anstatt ihn aufzurufen abort();Praktisch alle C-Compiler bieten einen Mechanismus, mit dem Sie dies tun können.

Normalerweise geschieht dies durch die einfache Implementierung einer Funktion oder eines Makros, die diesem Prototyp folgt:

void __assert(const char *expression, const char *file, int line);

Es wird aufgerufen, wenn ein Assertionsausdruck fehlschlägt.Normalerweise nicht assert() selbst, ist das, was „das“ ausführt printf() gefolgt von abort()„Das ist das standardmäßig dokumentierte Verhalten.Durch Anpassen dieser Funktion oder dieses Makros können Sie sein Verhalten ändern.

__builtin_trap();

Da Debugger() jetzt veraltet ist, sollte dies stattdessen funktionieren.

https://developer.apple.com/library/mac/technotes/tn2124/_index.html#//apple_ref/doc/uid/DTS10003391-CH1-SECCONTROLLEDCRASH

Für die Nachwelt:Ich habe Code zum Generieren von Stopps am richtigen Stack-Frame im Debugger und zum (optionalen) Anhalten der App, damit Sie den Debugger just-in-time anhängen können.Funktioniert für Simulator und Gerät (und möglicherweise für den Desktop, falls Sie ihn jemals benötigen sollten).Ausführlicher Beitrag unter http://iphone.m20.nl/wp/2010/10/xcode-iphone-debugger-halt-assertions/

Folgendes habe ich in einem gefunden Apple-Forum:

Xcode enthält keine eingebauten symbolischen Umbrüche - aber sie sind Schnell hinzuzufügen.Gehen Sie zum Fenster „Haltepunkte“ und fügen Sie Folgendes hinzu:

-[NSException-Erhöhung]

kill(getpid(), SIGINT);

Funktioniert im Simulator und im Gerät.

Es gibt auch die folgende Funktion, die als plattformübergreifende direkte Halt()-Alternative verfügbar ist:

#include <stdlib.h>

void abort(void);

Wir verwenden es in unserer plattformübergreifenden Engine für die iPhone-Implementierung im Falle schwerwiegender Behauptungen.Plattformübergreifend für Nintendo DS/Wii/XBOX 360/iOS usw.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top