Tidak ada yang saya coba untuk memperbaikinya (mencoba kedua kompiler, kedua debugger, dll.) Setelah memutakhirkan XCode untuk pembaruan iOS 5, tampaknya tidak ada jejak tumpukan yang berfungsi.
Namun, saya telah menemukan solusi yang efektif - membuat penangan pengecualian saya sendiri (yang juga berguna untuk alasan lain). Pertama, buat fungsi yang akan menangani kesalahan dan output ke konsol (serta apa pun yang ingin Anda lakukan dengannya):
void uncaughtExceptionHandler(NSException *exception) {
NSLog(@"CRASH: %@", exception);
NSLog(@"Stack Trace: %@", [exception callStackSymbols]);
// Internal error reporting
}
Selanjutnya, tambahkan penangan pengecualian ke delegasi aplikasi Anda:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
// Normal launch stuff
}
Itu dia!
Jika ini tidak berhasil, maka hanya ada dua kemungkinan alasan :
- Sesuatu menimpa
NSSetUncaughtExceptionHandler
panggilan Anda (hanya ada satu penangan untuk seluruh aplikasi Anda). Misalnya, beberapa perpustakaan pihak ke-3 mengatur uncaughtExceptionHandler mereka sendiri. Jadi, cobalah mengaturnya di AKHIR didFinishLaunchingWithOptions
fungsi Anda (atau menonaktifkan pustaka pihak ketiga secara selektif). Atau lebih baik lagi, atur break point simbolis NSSetUncaughtExceptionHandler
untuk segera melihat siapa yang memanggilnya. Yang mungkin ingin Anda lakukan adalah memodifikasi yang sekarang daripada menambahkan yang lain.
- Anda tidak benar-benar menghadapi pengecualian (misalnya,
EXC_BAD_ACCESS
adalah bukan pengecualian, kredit komentar @Erik B, di bawah)
uncaughtExceptionHandler
rutinitas tidak pernah diminta.Ada opsi yang berguna untuk menambahkan Exception Breakpoint (menggunakan + di bagian bawah Breakpoint Navigator). Ini akan berhenti pada Pengecualian apa pun (atau Anda dapat mengatur kondisi). Saya tidak tahu apakah pilihan ini baru di 4.2 atau jika saya akhirnya menyadari bahwa ini mencoba menyelesaikan masalah simbol yang hilang.
Setelah Anda mencapai breakpoint ini Anda dapat menggunakan Debug Navigator untuk menavigasi tumpukan panggilan, memeriksa variabel, dll seperti biasa.
Jika Anda menginginkan tumpukan panggilan simbolis yang cocok untuk disalin / ditempel atau sejenisnya, gtrb backtrace akan berfungsi dengan baik dari sana:
(dll)
sumber
Ada fitur baru pada debugger. Anda dapat mengatur break point kapan saja pengecualian dilemparkan dan menghentikan eksekusi di sana, seperti yang biasanya terjadi pada 4.0.
Pada "Breakpoint Navigator", tambahkan "Exception Breakpoint" dan cukup tekan "Done" pada popup opsi.
Itu saja!
PS: Dalam beberapa kasus akan lebih baik untuk istirahat hanya untuk pengecualian Objective-C.
sumber
Ini adalah satu solusi lagi, tidak seanggun sebelumnya, tetapi jika Anda tidak menambahkan breakpoint atau handler pengecualian, itu bisa menjadi satu-satunya cara.
Saat aplikasi mogok, dan Anda mendapatkan tumpukan panggilan lempar mentah pertama (dalam angka hex), ketikkan ke konsol Xcode
info line *hex
(jangan lupa tanda bintang dan0x
hex specifier), misalnya:Jika Anda menggunakan lldb , Anda dapat mengetik
image lookup -a hex
(tanpa tanda bintang dalam situasi ini), dan Anda mendapatkan hasil yang serupa.Dengan metode ini, Anda dapat melintasi dari atas tumpukan lemparan (akan ada sekitar 5-7 penyebar pengecualian sistem) ke fungsi Anda yang menyebabkan kerusakan, dan menentukan file dan baris kode yang tepat.
Juga, untuk efek serupa Anda dapat menggunakan utilitas atos di terminal, cukup ketik:
dan Anda mendapatkan jejak stack yang dilambangkan (setidaknya untuk fungsi Anda memiliki simbol debug). Metode ini lebih disukai, karena Anda tidak memiliki untuk setiap panggilan alamat
info line
, cukup salin alamat dari output konsol dan tempelkan ke terminal.sumber
Anda dapat menambahkan Exception Breakpoint (menggunakan + di bagian bawah Breakpoint Navigator) dan menambahkan action
bt
ke dalamnya (klik tombol Add Action, pilih Debugger Command, masukkan "bt" di bidang teks). Ini akan menampilkan jejak tumpukan segera setelah pengecualian dilemparkan.sumber
Ini adalah masalah umum, tidak mendapatkan jejak stack di 4.2. Anda dapat mencoba bertukar antara LLDB dan GDB untuk melihat apakah Anda mendapatkan hasil yang lebih baik.
Ajukan laporan bug di sini.
http://developer.apple.com/bugreporter/
EDIT:
Saya percaya bahwa jika Anda menukar kembali ke LLVM GCC 4.2 Anda tidak akan melihat ini terjadi. Anda mungkin kehilangan fitur yang Anda butuhkan.
sumber
Gunakan kode ini di fungsi utama Anda:
sumber
Pada jenis prompt konsol debug Xcode:
Dan itu akan menunjukkan kepada Anda sesuatu seperti:
sumber
Mengaktifkan 'Kompilasi untuk Ibu Jari' (konfigurasi debug) berhasil untuk saya.
sumber