Xcode tidak menunjukkan garis yang menyebabkan kerusakan

126

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?

JonasG
sumber
2
Apakah Anda menyusun untuk Rilis? Jika demikian cobalah mengatur skema ke Debug.
epatel
Bisa juga beberapa xib buruk menyebabkan program mogok di tempat dari kode sumber Anda sendiri, sehingga tidak menampilkan file apa pun. Kesalahan tersebut menjelaskan masalah untuk kunci kamus bernama "Tanggal"
epatel
1
Apple harus mempekerjakan lebih banyak penguji;)
Amr Lotfy

Jawaban:

301

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]:

  1. 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).

  2. Di bagian bawah navigator, klik tombol "+".

  3. Klik "Tambahkan Breakpoint Pengecualian".

  4. Breakpoint baru akan dibuat. Ini harus dikonfigurasi sesuai kebutuhan tetapi Anda dapat mengubah perilakunya.

  5. 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.

Tukang gerobak
sumber
4
Saya seorang noob dan berkembang hampir sebulan tanpa ini ... ini mengubah hidup saya.
Jonny Burger
4
Teman saya mendaftar untuk akun SO hanya untuk mengunggah posting ini.
Alex Spencer
1
ini disebut setengah assing pada bagian apel dalam buku saya
ChuckKelly
1
Apakah ini tetapi masih tidak dapat menemukan tempat yang disebut panjang pada null :(
Shereef Marzouk
1
Ini berfungsi, tetapi sisi buruknya adalah tidak lagi menampilkan detail pengecualian di konsol debug. Jadi saya dapat mematikan OFF breakpoint ini, dan melihat detail dan melacak pengecualian tetapi tidak DI MANA itu terjadi, atau menyalakannya untuk melihat di mana itu terjadi, tetapi dengan tidak MENGAPA. Adakah yang tahu bagaimana memiliki keduanya?
Gabriel Jensen
27

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.

masukkan deskripsi gambar di sini

(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 ...)

Mike Gledhill
sumber
6
Xcode adalah lingkungan pemrograman terburuk yang saya gunakan sejauh ini.
Siswa
Apa yang saya temukan menarik (sebagai pengembang Visual Studio) adalah berapa banyak pengembang Xcode yang saya temui, yang bersikeras bahwa Xcode adalah lingkungan terbaik yang pernah mereka gunakan. Logis, ramah dan membantu .. tetapi dengan beberapa kebiasaan. Bahkan sekarang, pada November 2019, Xcode memiliki peringkat App Store 3,1, dengan sebagian besar orang memberikannya 5-bintang atau 1-bintang. Tidak ada yang mendengarkan ....
Mike Gledhill
9

Mengedit skema saat ini dan memungkinkan NSZombieEnabled, MallocStackLogging, dan guard malloc. Lalu, ketika Aplikasi Anda mogok, ketikkan ini di konsol gdb:

(gdb) info malloc-history 0x543216

Ganti 0x543216dengan alamat objek yang menyebabkan NSInvalidArgumentExceptiondan seharusnya memberi Anda jejak stack jauh lebih berguna, menunjukkan garis-garis kode Anda yang menyebabkan crash.

dikunyah
sumber
1
Saya mencoba ini, dan terlempar kesalahan: 'info' bukan perintah yang valid. Ada saran?
achi
@EliGregory pastikan debugger Anda disetel ke gdb dan bukan lldb default. Anda dapat mengubahnya di menu Edit Skema di bawah bagian run.
chown
2

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?

Chuff Fluffulous
sumber
Sepakat. Jika Anda mencoba melakukan debug maka level optimisasi perlu diatur ke 0 (Tanpa Optimasi) di pengaturan build Anda.
Carter
1

Saya menulis kode untuk menghasilkan crash indeks di luar batas. Berikut ini adalah pengecualian yang dilemparkan.

2017-01-07 04:02:57.606 testABC[1694:52966] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSSingleObjectArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010e85cd4b __exceptionPreprocess + 171
    1   libobjc.A.dylib                     0x000000010e2be21e objc_exception_throw + 48
    2   CoreFoundation                      0x000000010e8b5c2f -[__NSSingleObjectArrayI objectAtIndex:] + 111
    3   testABC                             0x000000010dce962d -[ViewController ComplexFunction] + 61
    4   testABC                             0x000000010dce95db -[ViewController thirdFunction] + 43
    5   testABC                             0x000000010dce959b -[ViewController secondFunction] + 43
    6   testABC                             0x000000010dce955b -[ViewController firstFinction] + 43
    7   testABC                             0x000000010dce96c2 -[ViewController viewDidAppear:] + 50
    8   UIKit                               0x000000010ee28a6c -[UIViewController _setViewAppearState:isAnimating:] + 945
    9   UIKit                               0x000000010ee2b7da __64-[UIViewController viewDidMoveToWindow:shouldAppearOrDisappear:]_block_invoke + 42
    10  UIKit                               0x000000010ee29ac4 -[UIViewController _executeAfterAppearanceBlock] + 86
    11  UIKit                               0x000000010ec8d77c _runAfterCACommitDeferredBlocks + 653
    12  UIKit                               0x000000010ec7a273 _cleanUpAfterCAFlushAndRunDeferredBlocks + 566
    13  UIKit                               0x000000010ec9d757 __84-[UIApplication _handleApplicationActivationWithScene:transitionContext:completion:]_block_invoke_2 + 194
    14  CoreFoundation                      0x000000010e8016ac __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12
    15  CoreFoundation                      0x000000010e7e66f4 __CFRunLoopDoBlocks + 356
    16  CoreFoundation                      0x000000010e7e5e65 __CFRunLoopRun + 901
    17  CoreFoundation                      0x000000010e7e5884 CFRunLoopRunSpecific + 420
    18  GraphicsServices                    0x00000001126d9a6f GSEventRunModal + 161
    19  UIKit                               0x000000010ec80c68 UIApplicationMain + 159
    20  testABC                             0x000000010dce99df main + 111
    21  libdyld.dylib                       0x000000011174968d start + 1
    22  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

Jika Anda membaca dengan seksama First Throw call stack

0   CoreFoundation              0x000000010e85cd4b __exceptionPreprocess + 171
1   libobjc.A.dylib             0x000000010e2be21e objc_exception_throw + 48

0 and 1 adalah proses sistem setelah crash.

 2   CoreFoundation             0x000000010e8b5c2f -[__NSSingleObjectArrayI objectAtIndex:] + 111

2 adalah garis yang menyebabkan pengecualian.

3   testABC                     0x000000010dce962d -[ViewController ComplexFunction] + 61

3memberitahu Anda bahwa Nama kelas ( ViewController) dan fungsi naem ( ComplexFunction) di mana pengecualian dilemparkan.

AsifHabib
sumber
4
Errr, oke. Anda memang benar, tetapi apakah ini ramah? Di lingkungan pengembangan modern (1990-an dan seterusnya), ketika pengecualian terjadi, Anda akan dibawa ke jalur yang menyebabkan masalah. Sedangkan Xcode ... yah ... memberi Anda jejak tumpukan seperti ini. Bahkan Turbo Pascal tidak ketinggalan jaman ini !!!
Mike Gledhill
4
Sungguh konyol bahwa perusahaan yang seharusnya dikenal sebagai "pengalaman pengguna terbaik" tidak menyadari bahwa semua pengembang selama 20 tahun terakhir terbiasa melihat nomor baris tempat pengecualian dilemparkan dan BUKAN DALAM PENILAIAN. Apakah saya menjadi gila? Setiap bahasa yang pernah saya gunakan sepanjang hidup saya memberikan nomor baris. Bahkan C atau C ++.
mylovemhz