Chcę przetestować raportowanie awarii mojej aplikacji w terenie, celowo powodując awarię, gdy użytkownik wykonuje określoną czynność, której rzeczywisty użytkownik prawdopodobnie nie wykona przypadkowo.
Ale jaki jest dobry niezawodny sposób na spowodowanie awarii aplikacji, która nie generuje ostrzeżenia w czasie kompilacji?
Edycja: Zwróć uwagę, że wiele pozornie oczywistych odpowiedzi na to pytanie powoduje wyjątki, które zostają przechwycone przez Cocoa, a tym samym nie powodują awarii aplikacji.
iphone
objective-c
ios
Nestor
źródło
źródło
WebKit discarded an uncaught exception
za wszystkie te pomysły! Kto by pomyślał, że ostatnio tak trudno było spowodować awarię aplikacji?(void)0/0;
,(void)*(char*)0;
Odpowiedzi:
w Objective-C użyj C bezpośrednio, aby spowodować zły dostęp
Uwaga: chociaż działa to na każdym systemie, który znam - w przyszłej wersji środowiska wykonawczego C LUB kompilatora może to już nie prowadzić do awarii. zobacz Is null pointer dereference undefined Behavior in Objective-C? )
(w szybkim tempie musiałbyś połączyć się mostem z objC, aby to zrobić)
źródło
WebKit discarded an uncaught exception
rozwiązuje problem.Mój obecny ulubiony:
Klasyk:
I trochę pr0n:
Wszystkie z nich generują awarie przechwycone przez moje narzędzie do raportowania awarii.
źródło
assert()
to funkcja debugowania, nie ma sensu zostawiać takich okrucieństw w kompilacjach wydań. Istnieją na to testy jednostkowe.assert
nie jest funkcją debugowania. Nieudana asercja to błąd, który uważałeś za niemożliwy. Lepiej przerwać, nawet kompilację wydania, niż kontynuować uruchamianie programu z nieprzewidywalnymi konsekwencjami.Ponieważ wszyscy używamy Clang na iOS, jest to dość niezawodne:
Ma to tę zaletę, że został zaprojektowany dokładnie w tym celu, więc nie powinien generować żadnych ostrzeżeń ani błędów kompilatora.
źródło
abort();
powoduje nieprawidłowe zakończenie… To jest awaria.źródło
Co powiesz na stare dobre przepełnienie stosu :)
źródło
Najpopularniejszy - nierozpoznana awaria selektora:
Upewnij się, że nie masz metody -asdf zaimplementowanej w tej klasie haha
Lub indeks poza ograniczonym wyjątkiem:
I oczywiście
kill( getpid(), SIGABRT );
źródło
Myślę, że w Swift można łatwo rzucić fatalny błąd:
W rzeczywistości jest nawet przeznaczone do użycia tej funkcji na wypadek, gdyby coś poszło nie tak, aby spowodować awarię aplikacji.
Aby uniknąć instrukcji if w szczególnym przypadku, możesz również użyć
precondition
. Jest podobny doassert
, sprawia, że zamiar (jeśli jest potrzebny) jest dość jasny i nie jest usuwany w ostatecznej wersji jakoassert
. Jest używany jakprecondition(myBoolean, "This is a helpful error message for debugging.")
.źródło
Wyślij wiadomość do zwolnionego obiektu
źródło
(należy ... wpisać ... 30 znaków)
źródło
Możesz również zgłosić wyjątek:
źródło
Dodaj rozpoznawanie gestów do widoku, który rozpoznaje stuknięcie 10 palcami (5 palców w przypadku iPhone'a 10 może być trochę zatłoczonych). GR ma dołączoną metodę, która wykonuje każdy z wcześniej wspomnianych niezawodnych sposobów spowodowania awarii aplikacji. Większość użytkowników nie położy 10 palców na twojej aplikacji, więc jesteś bezpieczny przed przypadkowym spowodowaniem awarii przez ogólnego użytkownika.
Jednak powinieneś być w stanie użyć czegoś takiego jak Testflight lub po prostu wdrożyć go na urządzeniach osobistych i przetestować na wolności, zanim prześlesz go do Apple. Wymuszona awaria może spowodować odrzucenie aplikacji przez Apple.
źródło
mógłby spróbować czegoś takiego
powinien się zawiesić na EXC_BAD_ACCESS (może wymagać zwolnienia go po raz drugi, ale normalnie powinien już się zawiesić)
źródło
Pójdę z:
int raise(int sig);
Aby uzyskać więcej informacji
>man raise
źródło
Po prostu zabiłbym ten proces normalnie:
Więc jeśli zainstalujesz program obsługi z sygnałem, możesz również obsłużyć awarię, kończąc zapisywanie otwartych plików i innych rzeczy.
źródło
używam
źródło
Podczas pracy z RubyMotion używam tego:
źródło
Spróbuj tego:
źródło
błędne
NSLog
stwierdzenie to zrobiźródło