Setiap kali aplikasi saya mogok Xcode menyoroti panggilan UIApicationMain () di fungsi utama () sebagai garis yang menyebabkan kerusakan. Dalam beberapa kasus yang dulunya normal (kesalahan segmentasi misalnya) tetapi crash yang saya coba atasi adalah SIGABRT sederhana dengan informasi terperinci yang dicatat di konsol:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary setObject:forKey:]: attempt to insert nil value (key: Date)'
Xcode digunakan untuk menunjukkan baris yang tepat dengan SDK yang lebih tua tetapi karena saya memutakhirkan ke Xocde 4.2 yang berubah. Sangat jelas bahwa Xcode tahu persis apa yang menyebabkan crash (atau bisa tahu), tetapi masih tidak menunjukkan baris yang sebenarnya. Apakah ada perbaikan atau penyelesaian untuk ini?
objective-c
ios
xcode
cocoa-touch
nsexception
JonasG
sumber
sumber
Jawaban:
Anda juga harus memastikan bahwa Anda memiliki breakpoint yang ditetapkan untuk semua pengecualian. Ini akan menyebabkan Xcode berhenti pada baris di mana pengecualian terjadi. Lakukan hal berikut [dalam Xcode 4]:
Di Project Navigator di sebelah kiri Xcode, klik pada breakpoint navigator (hampir sampai ke sisi kanan bilah tombol atas. Ikonnya terlihat seperti panah kanan yang gemuk).
Di bagian bawah navigator, klik tombol "+".
Klik "Tambahkan Breakpoint Pengecualian".
Breakpoint baru akan dibuat. Ini harus dikonfigurasi sesuai kebutuhan tetapi Anda dapat mengubah perilakunya.
Jalankan proyek Anda dan buat kembali pengecualian.
Anda juga menyebutkan bahwa Anda menautkan ke beberapa pustaka / kerangka kerja pihak ketiga. Jika pengecualian terjadi dalam kerangka kerja itu maka Anda akan mengalami kesulitan karena kode dikompilasi dan Xcode tidak bisa benar-benar menunjukkan kepada Anda baris yang menyebabkan pengecualian. Jika ini masalahnya dan Anda yakin Anda menggunakan perpustakaan dengan benar, maka Anda harus mengajukan laporan bug kepada pengelola perpustakaan tersebut.
sumber
Cukup ikuti instruksi pada jawaban StackOverflow ini:
Aktifkan Zombies
Pada dasarnya, Anda hanya perlu "Aktifkan Zombies". Maka Xcode harus memecah pada baris mana pun yang menyebabkan masalah.
(Ini benar-benar mengejutkan bahwa, bahkan pada tahun 2017, Xcode masih memiliki ini dimatikan secara default. Mengapa Anda tidak ingin melihat garis yang menyebabkan masalah? Dan " Aktifkan Objek Zombie "?! Sungguh?! Apakah penulis Xcode benar-benar? percaya bahwa ini adalah nama yang berguna, yang akan masuk akal bagi pengembang baru? Menyedihkan betapa buruknya peringkat Xcode, tahun demi tahun, di App Store. Tidak ada yang mendengarkan ...)
sumber
Mengedit skema saat ini dan memungkinkan
NSZombieEnabled
,MallocStackLogging
, danguard malloc
. Lalu, ketika Aplikasi Anda mogok, ketikkan ini di konsol gdb:Ganti
0x543216
dengan alamat objek yang menyebabkanNSInvalidArgumentException
dan seharusnya memberi Anda jejak stack jauh lebih berguna, menunjukkan garis-garis kode Anda yang menyebabkan crash.sumber
Saya telah melihat perilaku ini dalam kode yang sangat dioptimalkan; memeriksa, mengubah tingkat optimasi target Anda dan lib pihak ketiga dapat membantu. (Pengaturan level Optimalisasi LLVM 3.0)
Apakah Anda membuat simbol debug?
sumber
Saya menulis kode untuk menghasilkan crash indeks di luar batas. Berikut ini adalah pengecualian yang dilemparkan.
Jika Anda membaca dengan seksama
First Throw call stack
0 and 1
adalah proses sistem setelah crash.2
adalah garis yang menyebabkan pengecualian.3
memberitahu Anda bahwa Nama kelas (ViewController
) dan fungsi naem (ComplexFunction
) di mana pengecualian dilemparkan.sumber