Ich möchte die Absturzberichte meiner App vor Ort testen, indem ich sie absichtlich abstürzen lasse, wenn der Benutzer eine bestimmte Aktion ausführt, die ein echter Benutzer wahrscheinlich nicht versehentlich ausführt.
Aber was ist eine gute und zuverlässige Methode, um die App zum Absturz zu bringen, die beim Kompilieren keine Warnung erzeugt?
Bearbeiten: Beachten Sie, dass viele scheinbar offensichtliche Antworten auf diese Frage zu Ausnahmen führen, die von Cocoa abgefangen werden und daher nicht zum Absturz der App führen.
iphone
objective-c
ios
Nestor
quelle
quelle
WebKit discarded an uncaught exception
für all diese Ideen bisher! Wer wusste, dass es heutzutage so schwer ist, eine App zum Absturz zu bringen?(void)0/0;
,(void)*(char*)0;
Antworten:
Verwenden Sie in Objective-C C direkt, um einen schlechten Zugriff zu verursachen
Hinweis: Während dies auf jedem mir bekannten System funktioniert, führt dies in einer zukünftigen Version der C-Laufzeit ODER des Compilers möglicherweise nicht mehr zu einem Absturz. Siehe Ist die Nullzeiger-Dereferenzierung in Objective-C undefiniertes Verhalten? )
(In Kürze müssten Sie eine Brücke zu objC schlagen, um dies zu tun)
quelle
WebKit discarded an uncaught exception
Problem.Mein aktueller Favorit:
Ein Klassiker:
Und einige pr0n:
Alle von ihnen erzeugen Abstürze, die von meinem Absturzberichtstool erfasst wurden.
quelle
assert()
ist eine Debug-Funktion, die wenig Sinn macht, solche Cruft in Release-Builds zu belassen. Dafür gibt es Unit-Tests.assert
ist keine Debug-Funktion. Eine fehlgeschlagene Behauptung ist ein Fehler, den Sie für unmöglich gehalten haben. Es ist besser, einen Release-Build abzubrechen, als weiterhin ein Programm mit unvorhersehbaren Konsequenzen auszuführen.Da wir alle Clang für iOS verwenden, ist dies ziemlich zuverlässig:
Dies hat den Vorteil, dass es genau für diesen Zweck entwickelt wurde, sodass keine Compiler-Warnungen oder -Fehler generiert werden sollten.
quelle
abort();
verursacht eine abnormale Beendigung… Das ist ein Absturz.quelle
Wie wäre es mit einem guten alten Stapelüberlauf :)
quelle
Am beliebtesten - nicht erkannter Selektorabsturz:
Stellen Sie sicher, dass in dieser Klasse keine -asdf-Methode implementiert ist, haha
Oder Index jenseits der gebundenen Ausnahme:
Und natürlich
kill( getpid(), SIGABRT );
quelle
Ich denke, in Swift könnte man leicht einen fatalen Fehler machen:
Es ist sogar beabsichtigt, diese Funktion zu verwenden, falls etwas schief geht, um die App zum Absturz zu bringen.
Um eine if-Anweisung in einem speziellen Fall zu vermeiden, können Sie auch verwenden
precondition
. Es ist ähnlich wieassert
, macht also die Absicht (wenn gewünscht) ziemlich klar und ist nicht wie in der endgültigen Version entferntassert
. Es wird wie verwendetprecondition(myBoolean, "This is a helpful error message for debugging.")
.quelle
Senden Sie eine Nachricht an ein freigegebenes Objekt
quelle
(muss ... 30 Zeichen eingeben)
quelle
Sie können auch eine Ausnahme auslösen:
quelle
Fügen Sie einer Ansicht, die ein Tippen mit 10 Fingern erkennt, eine Gestenerkennung hinzu (5 Finger für das iPhone, da 10 etwas überfüllt sein können). Dem GR ist eine Methode zugeordnet, die eine der zuvor genannten todsicheren Methoden ausführt, um Ihre App zum Absturz zu bringen. Die meisten Benutzer werden nicht 10 Finger auf Ihre App legen, sodass Sie vor dem allgemeinen Benutzer geschützt sind, der versehentlich den Absturz verursacht.
Sie sollten jedoch in der Lage sein, Testflight zu verwenden oder es einfach auf persönlichen Geräten bereitzustellen und in freier Wildbahn zu testen, bevor Sie es jemals an Apple senden. Ein erzwungener Absturz kann dazu führen, dass Ihre App von Apple abgelehnt wird.
quelle
könnte so etwas versuchen
sollte auf einem EXC_BAD_ACCESS abstürzen (muss möglicherweise ein zweites Mal freigegeben werden, sollte aber normalerweise bereits so abstürzen)
quelle
Ich werde gehen mit:
int raise(int sig);
Um mehr Infos zu bekommen
>man raise
quelle
Ich würde den Prozess einfach normal beenden:
Wenn Sie also einen Handler mit Signal installieren, können Sie auch den Absturz behandeln und das Schreiben geöffneter Dateien und dieser Dinge beenden.
quelle
ich benutze
quelle
Bei der Arbeit mit RubyMotion verwende ich Folgendes:
quelle
Versuche dies:
quelle
eine falsche
NSLog
Aussage wird es tunquelle