Saat menyebarkan aplikasi ke perangkat, program akan berhenti setelah beberapa siklus dengan kesalahan berikut:
Program received signal: "EXC_BAD_ACCESS".
Program ini berjalan tanpa masalah pada simulator iPhone, itu juga akan debug dan berjalan selama saya melangkah melalui instruksi satu per satu. Begitu saya membiarkannya berjalan lagi, saya akan menekan EXC_BAD_ACCESS
sinyalnya.
Dalam kasus khusus ini, itu terjadi kesalahan dalam kode akselerometer. Itu tidak akan dieksekusi di dalam simulator, itu sebabnya ia tidak melakukan kesalahan. Namun, itu akan dieksekusi setelah dikerahkan ke perangkat.
Sebagian besar jawaban untuk pertanyaan ini berhubungan dengan EXC_BAD_ACCESS
kesalahan umum , jadi saya akan membiarkan ini terbuka sebagai jawaban untuk semua kesalahan Akses Buruk yang ditakuti.
EXC_BAD_ACCESS
biasanya dilemparkan sebagai akibat dari akses memori ilegal. Anda dapat menemukan informasi lebih lanjut dalam jawaban di bawah ini.
Pernahkah Anda menemukan EXC_BAD_ACCESS
sinyal sebelumnya, dan bagaimana Anda menghadapinya?
sumber
Penyebab utama EXC_BAD_ACCESS adalah dari mencoba mengakses objek yang dirilis.
Untuk mengetahui cara memecahkan masalah ini, baca dokumen ini: DebuggingAutoReleasePool
Bahkan jika Anda tidak berpikir "melepaskan objek yang dilepaskan secara otomatis", ini akan berlaku untuk Anda.
Metode ini bekerja sangat baik. Saya menggunakannya sepanjang waktu dengan sukses besar !!
Singkatnya, ini menjelaskan cara menggunakan kelas debugging NSZombie Cocoa dan alat baris perintah "malloc_history" untuk menemukan secara tepat objek apa yang dirilis telah diakses dalam kode Anda.
Sidenote:
Menjalankan Instrumen dan memeriksa kebocoran tidak akan membantu memecahkan masalah EXC_BAD_ACCESS. Saya cukup yakin kebocoran memori tidak ada hubungannya dengan EXC_BAD_ACCESS. Definisi kebocoran adalah objek yang tidak dapat Anda akses lagi, dan karena itu Anda tidak dapat menyebutnya.
UPDATE: Saya sekarang menggunakan Instrumen untuk men-debug Kebocoran. Dari Xcode 4.2, pilih Produk-> Profil dan ketika Instrumen diluncurkan, pilih "Zombies".
sumber
Sinyal EXC_BAD_ACCESS adalah hasil dari melewatkan pointer yang tidak valid ke panggilan sistem. Saya mendapat satu hanya sebelumnya hari ini dengan program uji pada OS X - Saya melewati variabel tidak diinisialisasi
pthread_join()
, yang disebabkan oleh kesalahan ketik sebelumnya.Saya tidak terbiasa dengan pengembangan iPhone, tetapi Anda harus memeriksa ulang semua buffer point yang Anda berikan kepada panggilan sistem. Tingkatkan tingkat peringatan kompiler Anda (dengan gcc, gunakan opsi
-Wall
dan-Wextra
). Aktifkan sebanyak mungkin diagnostik pada simulator / debugger mungkin.sumber
Dalam pengalaman saya, ini umumnya disebabkan oleh akses memori ilegal. Periksa semua pointer, terutama pointer objek, untuk memastikan mereka diinisialisasi. Pastikan file MainWindow.xib Anda, jika Anda menggunakannya, diatur dengan benar, dengan semua koneksi yang diperlukan.
Jika tidak ada pemeriksaan di atas kertas yang menghasilkan apa pun, dan itu tidak terjadi ketika satu langkah, coba cari kesalahan dengan pernyataan NSLog (): taburkan kode Anda dengannya, gerakkan di sekitar sampai Anda mengisolasi baris yang menyebabkan kesalahan. Kemudian atur breakpoint pada baris itu dan jalankan program Anda. Ketika Anda mencapai breakpoint, periksa semua variabel, dan objek di dalamnya, untuk melihat apakah ada yang tidak seperti yang Anda harapkan. Saya terutama mengawasi variabel yang kelas objeknya adalah sesuatu yang tidak Anda harapkan. Jika suatu variabel seharusnya berisi UIWindow tetapi memiliki NSNotification di dalamnya sebagai gantinya, kesalahan kode dasar yang sama dapat memanifestasikan dirinya dengan cara yang berbeda ketika debugger tidak beroperasi.
sumber
Saya hanya menghabiskan beberapa jam melacak EXC_BAD_ACCESS dan menemukan NSZombies dan vv envv lain tampaknya tidak memberi tahu saya apa pun.
Bagi saya, itu adalah pernyataan NSLog yang bodoh dengan penentu format, tetapi tidak ada argumen yang lolos.
Diperbaiki oleh
sumber
Video WWDC 2010 tersedia untuk semua peserta dalam program pengembang apel. Ada video yang luar biasa: "Sesi 311 - Analisis Memori Tingkat Lanjut dengan Instrumen" yang menunjukkan beberapa contoh penggunaan zombie dalam instrumen dan men-debug masalah memori lainnya.
Untuk tautan ke halaman login, klik DI SINI .
sumber
Bukan jawaban yang lengkap, tetapi satu situasi khusus di mana saya menerima ini adalah ketika mencoba mengakses objek yang 'mati' karena saya mencoba menggunakan autorelease:
Jadi misalnya, saya sebenarnya meneruskan ini sebagai objek untuk 'memberi tahu' (mendaftarkannya sebagai pendengar, pengamat, idiom apa pun yang Anda suka) tetapi sudah mati begitu pemberitahuan dikirim dan saya akan mendapatkan EXC_BAD_ACCESS. Mengubahnya ke
[[MyNetObject alloc] init]
dan melepaskannya nanti jika sesuai menyelesaikan kesalahan.Alasan lain ini mungkin terjadi adalah misalnya jika Anda memasukkan objek dan mencoba untuk menyimpannya:
Nanti ketika mencoba mengakses myObjectDefinedInHeader Anda mungkin mendapat masalah. Menggunakan:
mungkin apa yang Anda butuhkan. Tentu saja ini hanya beberapa contoh dari apa yang telah saya temui dan ada alasan lain, tetapi ini dapat membuktikan sulit dipahami sehingga saya menyebutkannya. Semoga berhasil!
sumber
Hanya untuk menambahkan situasi lain di mana ini bisa terjadi:
Saya punya kode:
Jelas saya lupa mengalokasikan memori untuk string:
memperbaiki masalah.
sumber
Metode lain untuk menangkap pengecualian EXC_BAD_ACCESS sebelum terjadi adalah penganalisa statis , dalam XCode 4+.
Jalankan analisa statis dengan Produk> Analisis (shift + cmd + B). Mengklik pada pesan apa pun yang dihasilkan oleh penganalisa akan menampilkan diagram pada sumber Anda yang menunjukkan urutan mempertahankan / melepaskan objek yang menyinggung.
sumber
Saya merasa berguna untuk menetapkan breakpoint pada objc_exception_throw. Dengan begitu debugger akan rusak ketika Anda mendapatkan EXC_BAD_ACCESS.
Instruksi dapat ditemukan di sini Teknik Debugging
sumber
Gunakan aturan sederhana "jika Anda tidak mengalokasikan atau menyimpannya, jangan lepaskan".
sumber
Cara Mendebug EXC_BAD_ACCESS
Lihat tautan di atas dan lakukan seperti yang tertulis .... Hanya beberapa instruksi cepat untuk menggunakan NSZombies
Jalankan aplikasi dan setelah itu gagal (Seharusnya menampilkan "Terganggu" daripada "EXC_BAD_ACCESS" ... periksa Konsol (Jalankan> Konsol) ... seharusnya ada pesan di sana sekarang memberitahukan objek apa yang coba diakses.
-Ben
sumber
Saya telah men-debug, dan kode refactoring untuk menyelesaikan kesalahan ini selama empat jam terakhir. Sebuah posting di atas membuat saya melihat masalah:
Properti sebelum: startPoint = [[Alokasi DataPoint] init]; startPoint = [DataPointList objectAtIndex: 0];
. . . x = startPoint.x - 10; // EXC_BAD_ACCESS
Properti setelah: startPoint = [[Alokasi DataPoint] init]; startPoint = [[DataPointList objectAtIndex: 0] retain];
Selamat tinggal EXC_BAD_ACCESS
sumber
Semoga Anda melepaskan 'string' setelah selesai!
sumber
Saya lupa mengembalikan diri dengan init-Method ...;)
sumber
Ini adalah utas yang sangat bagus. Inilah pengalaman saya: Saya mengacaukan kata kunci retain / assign pada deklarasi properti. Saya bilang:
di mana saya seharusnya mengatakan
sumber
Saya menemukan EXC_BAD_ACCESS di iPhone hanya ketika mencoba mengeksekusi metode C yang menyertakan array besar. Simulator itu mampu memberi saya cukup memori untuk menjalankan kode, tetapi bukan perangkat (array adalah satu juta karakter, jadi itu sedikit berlebihan!).
EXC_BAD_ACCESS terjadi tepat setelah titik masuk dari metode ini, dan membuat saya bingung untuk beberapa saat karena itu tidak ada di dekat deklarasi array.
Mungkin orang lain akan mendapat manfaat dari beberapa jam mencabuti rambutku.
sumber
Lupa mengambil pointer yang tidak dialokasikan dari
dealloc
. Saya mendapatkan exc_bad_access di rootView saya dari UINavigationController, tetapi hanya kadang-kadang. Saya berasumsi bahwa masalahnya ada di rootView karena terhenti di tengah-tengah viewDidAppear {}. Ternyata hanya terjadi setelah saya membuka tampilan dengan rilis dealloc buruk {}, dan hanya itu!"EXC_BAD_ACCESS" [Beralih ke proses 330] Tidak ada memori untuk diprogram sekarang: tidak aman untuk memanggil malloc
Saya pikir itu adalah masalah di mana saya mencoba untuk mengalokasikan ... bukan di mana saya mencoba untuk melepaskan non-alokasi, D'oh!
sumber
Bagaimana saya berurusan dengan EXC_BAD_ACCESS
Terkadang saya merasa bahwa ketika kesalahan EXC_BAD_ACCESS dilemparkan xcode akan menampilkan kesalahan di kelas main.m. Tidak memberikan informasi tambahan di mana crash terjadi (Kadang-kadang).
Pada saat-saat itu kita dapat mengatur Breakpoint Luar Biasa di Xcode sehingga ketika pengecualian tertangkap breakpoint akan ditempatkan dan akan secara langsung intim dengan pengguna bahwa crash telah terjadi di baris itu
sumber
Panggilan NSAssert () untuk memvalidasi parameter metode cukup berguna untuk melacak dan menghindari melewati nil juga.
sumber
Saya baru saja mengalami masalah ini. Bagi saya alasannya menghapus objek yang dikelola CoreData dan mencoba membacanya setelah itu dari tempat lain.
sumber
Saya telah men-debug, dan kode refactoring untuk menyelesaikan kesalahan ini selama empat jam terakhir. Sebuah posting di atas membuat saya melihat masalah:
Properti sebelum:
Properti setelah:
Selamat tinggal
EXC_BAD_ACCESS
Terima kasih banyak atas jawaban Anda. Saya telah berjuang dengan masalah ini sepanjang hari. Kamu luar biasa!
sumber
Hanya untuk menambahkan
Lynda.com memiliki DVD fantastis yang disebut
dan Bab 6, Pelajaran 3 adalah tentang EXEC_BAD_ACCESS dan bekerja dengan Zombies.
Itu bagus untuk saya mengerti, bukan hanya kode kesalahan tetapi bagaimana saya bisa menggunakan Zombies untuk mendapatkan lebih banyak info tentang objek yang dirilis.
sumber
Untuk memeriksa kesalahan apa yang mungkin terjadi
Gunakan NSZombieEnabled.
Untuk mengaktifkan fasilitas NSZombieEnabled di aplikasi Anda:
Pilih Project> Edit Active Executable untuk membuka jendela Info yang dapat dieksekusi. Klik Argumen. Klik tombol tambah (+) di bagian “Variabel yang akan diatur di lingkungan”. Masukkan NSZombieEnabled di kolom Nama dan YES di kolom Nilai. Pastikan tanda centang untuk entri NSZombieEnabled dipilih.
Saya menemukan jawaban ini di iPhoneSDK
sumber
Saya menyadari ini ditanya beberapa waktu lalu, tetapi setelah membaca utas ini, saya menemukan solusi untuk XCode 4.2: Produk -> Edit Skema -> Tab Diagnostik -> Aktifkan Objek Zombie
Membantu saya menemukan pesan yang dikirim ke objek yang tidak dialokasikan.
sumber
Ketika Anda memiliki rekursi tak terbatas, saya pikir Anda juga dapat memiliki kesalahan ini. Ini adalah kasus bagi saya.
sumber
Bahkan kemungkinan lain: menggunakan blok dalam antrian, mungkin dengan mudah terjadi bahwa Anda mencoba mengakses objek dalam antrian lain, yang sudah tidak dialokasikan pada saat ini. Biasanya ketika Anda mencoba mengirim sesuatu ke GUI. Jika breakpoint pengecualian Anda diatur di tempat yang aneh, maka ini mungkin penyebabnya.
sumber
Saya mendapatkannya karena saya tidak menggunakan
[self performSegueWithIdentifier:sender:]
dan-(void) prepareForSegue:(UIstoryboardSegue *)
benarsumber
Jangan lupa
@
simbol saat membuat string, perlakukanC-strings
sesuaiNSStrings
keinginanEXC_BAD_ACCESS
.Gunakan ini:
Daripada ini:
PS - biasanya ketika mengisi konten
array
dengan banyak catatan.sumber
XCode 4 dan di atasnya, telah dibuat sangat sederhana dengan Instrumen. Jalankan saja Zombies di Instrumen. Tutorial ini menjelaskan dengan baik: debugging instrumen xcode error exc_bad_access
sumber