Saya ingin menguji pelaporan kerusakan aplikasi saya di lapangan dengan sengaja membuatnya mogok saat pengguna melakukan tindakan tertentu yang tidak mungkin dilakukan oleh pengguna sebenarnya secara tidak sengaja.
Tapi apa cara andal yang baik untuk membuat aplikasi mogok yang tidak membuat peringatan pada waktu kompilasi?
Sunting: Perhatikan bahwa banyak jawaban yang tampaknya jelas untuk pertanyaan ini menghasilkan pengecualian yang ditangkap oleh Cocoa dan karenanya tidak mengakibatkan aplikasi mogok.
iphone
objective-c
ios
Nestor
sumber
sumber
WebKit discarded an uncaught exception
semua ide ini sejauh ini! Siapa yang tahu sangat sulit membuat aplikasi mogok akhir-akhir ini?(void)0/0;
,(void)*(char*)0;
Jawaban:
di Objective-C gunakan C secara langsung untuk menyebabkan akses yang buruk
strcpy(0, "bla");
Catatan: meskipun ini berfungsi pada sistem apa pun yang saya tahu - di versi runtime C yang akan datang ATAU kompiler, hal ini mungkin tidak akan menyebabkan crash lagi. lihat Apakah null pointer dereference perilaku tidak terdefinisi di Objective-C? )
(secepatnya Anda harus menjembatani objC untuk melakukan ini)
sumber
WebKit discarded an uncaught exception
masalah.Favorit saya saat ini:
assert(! "crashing on purpose to test <insert your reason here>");
Sebuah klasik:
Dan beberapa pr0n:
*(long*)0 = 0xB16B00B5;
Semuanya menghasilkan kerusakan yang ditangkap oleh alat pelaporan kerusakan saya.
sumber
assert()
adalah fitur debug, tidak masuk akal untuk membiarkan hal semacam itu dalam build rilis. Ada tes unit untuk itu.assert
bukanlah fitur debug. Penegasan yang gagal adalah bug yang menurut Anda tidak mungkin. Lebih baik membatalkan, bahkan rilis build, daripada terus menjalankan program dengan konsekuensi yang tidak dapat diprediksi.Karena kita semua menggunakan Clang untuk iOS, ini cukup dapat diandalkan:
Ini memiliki keuntungan karena dirancang untuk tujuan ini, jadi tidak akan menghasilkan peringatan atau kesalahan kompiler.
sumber
abort();
menyebabkan penghentian tidak normal… Itu adalah kecelakaan.sumber
Bagaimana dengan stack overflow lama yang bagus :)
- (void)stackOverflow { [self stackOverflow]; }
sumber
Yang paling populer - kerusakan pemilih yang tidak dikenal:
NSObject *object = [[NSObject alloc] init]; [object performSelector:@selector(asfd)];
Pastikan Anda tidak menerapkan metode -asdf di kelas itu haha
Atau indeks di luar pengecualian terikat:
NSArray * array = [NSArray array]; [array objectAtIndex:5];
Dan tentu saja
kill( getpid(), SIGABRT );
sumber
Saya pikir di Swift Anda dapat dengan mudah membuat kesalahan fatal:
func foo() { fatalError("crash!") }
Bahkan sebenarnya dimaksudkan untuk menggunakan fitur ini jika terjadi kesalahan untuk membuat aplikasi macet.
Untuk menghindari pernyataan if dalam kasus khusus, Anda dapat menggunakan
precondition
juga. Ini mirip denganassert
, membuat niat (jika diinginkan) cukup jelas dan tidak dihapus dalam rilis final sebagaiassert
. Ini digunakan sepertiprecondition(myBoolean, "This is a helpful error message for debugging.")
.sumber
Mengirim pesan ke objek yang tidak dialokasikan
sumber
exit(0);
(harus ... ketik ... 30 karakter)
sumber
Anda juga dapat mengajukan pengecualian:
[NSException raise:NSInternalInconsistencyException format:@"I want to test app crashes!."];
sumber
Tambahkan pengenal gerakan ke tampilan yang mengenali ketukan 10 jari (5 jari untuk iPhone 10 bisa menjadi agak ramai). GR memiliki metode yang menyertainya yang mengeksekusi salah satu cara pasti yang disebutkan sebelumnya untuk membuat aplikasi Anda mogok. Sebagian besar pengguna tidak akan meletakkan 10 jari ke bawah pada aplikasi Anda, jadi Anda aman dari pengguna umum yang secara tidak sengaja menyebabkan crash.
Namun Anda harus dapat menggunakan sesuatu seperti Testflight atau hanya menyebarkannya ke perangkat pribadi dan menguji di alam liar sebelum mengirimkannya ke Apple. Memiliki crash paksa dapat membuat aplikasi Anda ditolak oleh Apple.
sumber
bisa mencoba sesuatu seperti
NSArray* crashingArray = [NSArray arrayWithCapacity:1]; [crashingArray release];
harus macet di EXC_BAD_ACCESS (mungkin perlu merilisnya untuk kedua kalinya tetapi normalnya seharusnya sudah macet seperti ini)
sumber
Saya akan pergi dengan:
int raise(int sig);
Untuk mendapatkan info lebih lanjut
>man raise
sumber
Saya hanya akan menghentikan proses secara normal:
Jadi jika Anda menginstal penangan dengan sinyal Anda juga dapat menangani crash, menyelesaikan untuk menulis file yang dibuka dan hal-hal ini.
sumber
saya menggunakan
[self doesNotRecognizeSelector:_cmd];
sumber
Saat bekerja dengan RubyMotion saya menggunakan ini:
n=Pointer.new ('c', 1) n[1000] ='h'
sumber
Coba ini:
- (IBAction)Button:(id)sender { NSArray *array = [NSArray new]; NSLog(@"%@",[array objectAtIndex:8]); }
sumber
NSLog
pernyataan yang salah akan berhasilNSLog(@"%@",1);
sumber