Apa's makna pengecualian kode EXC_I386_GPFLT
?
Apakah maknanya bervariasi sesuai dengan situasi?
Dalam hal ini, saya'm mengacu pada jenis pengecualian EXC_BAD_ACCESS
dengan pengecualian kode EXC_I386_GPFLT
Program ini dikembangkan dalam Xcode 5.0.1, berurusan dengan cblas_zgemm()
dari perpustakaan BLAS.(Yah, saya kira itu doesn't peduli...)
Terima kasih banyak!
EXC_I386_GPFLT pasti mengacu pada "General Protection fault", yang merupakan x86's cara untuk memberitahu anda bahwa "anda melakukan sesuatu yang anda tidak diizinkan untuk melakukan". Biasanya DOESN'T berarti bahwa anda akses dari memori batas, tapi itu bisa jadi kode anda pergi keluar dari batas-batas dan menyebabkan kode yang buruk/data yang akan digunakan dalam cara yang membuat untuk sebuah perlindungan pelanggaran dari beberapa macam.
Sayangnya hal ini dapat sulit untuk mengetahui persis apa masalahnya tanpa konteks yang lebih banyak, ada 27 penyebab yang berbeda yang tercantum di AMD64 Programmer's Manual, Vol 2 dari tahun 2005 - dengan semua account, ada kemungkinan bahwa 8 tahun kemudian akan menambahkan beberapa lebih.
Jika itu adalah sistem 64-bit, sebuah skenario yang masuk akal adalah bahwa kode anda menggunakan "non-kanonik pointer" - yang berarti bahwa 64-bit alamat yang dibentuk sedemikian rupa sehingga bagian atas 16 bit dari alamat aren't semua salinan atas bawah 48 bit (dengan kata lain, bagian atas 16 bit dari alamat semua harus 0 atau 1, berdasarkan pada bit hanya di bawah 16 bit). Aturan ini untuk menjamin bahwa arsitektur dapat "aman memperluas jumlah bit valid di kisaran alamat". Hal ini akan menunjukkan bahwa kode ini baik timpa beberapa pointer data dengan hal-hal lain, atau pergi keluar dari batas-batas ketika membaca beberapa pointer nilai.
Kemungkinan lain penyebabnya adalah tidak selaras akses dengan register SSE - dengan kata lain, membaca 16-byte register SSE dari alamat yang isn't 16-byte blok.
Ada, seperti yang saya katakan, banyak alasan lain yang mungkin, tapi kebanyakan dari mereka melibatkan hal-hal yang "normal" kode tidak't melakukan dalam 32 - atau 64-bit OS (seperti loading segment register tidak valid pemilih indeks atau menulis untuk MSR's (model tertentu register)).
Anda dapat sering mendapatkan informasi dari header file. Misalnya:
$ cd /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk
$ find usr -name \*.h -exec fgrep -l EXC_I386_GPFLT {} \;
usr/include/mach/i386/exception.h
^C
$ more usr/include/mach/i386/exception.h
....
#define EXC_I386_GPFLT 13 /* general protection fault */
OK, jadi itu's a general protection fault (seperti namanya sih). Googling "i386 general protection fault" menghasilkan banyak hits, tapi ini terlihat menarik:
perlindungan Memori ini juga diimplementasikan dengan menggunakan segmen penjelas. Pertama, prosesor akan memeriksa apakah nilai yang dimuat dalam segmen daftar referensi keterangan valid. Kemudian ia memeriksa bahwa setiap alamat linier yang dihitung benar-benar terletak di dalam segmen. Juga, jenis mengakses (membaca, menulis, atau mengeksekusi) diperiksa terhadap informasi di segmen descriptor. Setiap kali salah satu dari pemeriksaan ini gagal, kecuali (mengganggu) 13 (hex 0D) dinaikkan. Pengecualian ini disebut General Protection Fault (GPF).
Bahwa 13
sesuai dengan apa yang kita lihat di file header, sehingga terlihat seperti hal yang sama. Namun dari aplikasi programmer's point-of-view, itu hanya berarti kita're referensi memori kita tidak't, dan itu's doesn't benar-benar peduli bagaimana hal itu's diimplementasikan pada hardware.
Untuk debug dan menemukan sumber: Mengaktifkan Zombie untuk aplikasi (Produk\Skema) dan Peluncuran Instrumen, Pilih Zombie. Menjalankan aplikasi anda di Xcode Kemudian pergi ke Instrumen mulai merekam. Kembali ke Aplikasi anda dan mencoba menghasilkan kesalahan. Instrumen harus mendeteksi bad call (zombie) jika ada satu.
Semoga membantu!
Aku bertanya-tanya mengapa ini muncul saat saya tes unit.
Saya telah menambahkan metode deklarasi untuk protokol yang termasuk melempar
; tetapi berpotensi metode lempar itu't bahkan digunakan dalam tes tertentu. Memungkinkan Zombie di tes terdengar seperti terlalu banyak kesulitan.
Ternyata ⌘K bersih melakukan trik. I'm selalu flabberghasted ketika itu memecahkan masalah-masalah aktual.
Saya punya yang mirip kecuali pada Swift 4.2. Saya menghabiskan waktu sekitar setengah jam mencoba untuk menemukan bug dalam kode saya, tapi masalah ini hilang setelah penutupan Xcode dan menghapus berasal folder data. Berikut ini adalah cara pintas:
rm -rf ~/Library/Developer/Xcode/DerivedData
Dalam kasus saya, kesalahan dilemparkan di Xcode ketika menjalankan sebuah aplikasi di iOS simulator. Sementara saya tidak bisa menjawab pertanyaan spesifik "apa kesalahan yang berarti", saya dapat mengatakan apa yang membantu saya, mungkin hal ini juga membantu orang lain.
Solusi bagi saya adalah untuk Menghapus Semua Konten dan Pengaturan
di simulator dan untuk bersih-Bersih Folder Build...
di Xcode.
Hal ini terjadi pada saya karena Xcode didn't tampak seperti saya menggunakan nama variabel yang sama pada dua kelas yang berbeda (yang sesuai dengan protokol yang sama, jika yang penting, meskipun variabel nama memiliki apa-apa yang terkait dalam setiap protocol). Aku hanya berganti nama saya variabel baru.
Aku harus melangkah ke setter di mana ia menabrak dalam rangka untuk melihat itu, saat debugging. Jawaban ini berlaku untuk iOS
Jika kesalahan dilemparkan dalam sebuah penutupan yang mendefinisikan diri
sebagai unowned
, anda mungkin akan terbatas pada apa yang dapat anda akses dan anda akan mendapatkan kode kesalahan ini dalam situasi tertentu. Terutama saat debugging. Jika ini adalah kasus untuk anda mencoba mengubah [unowned diri]
untuk [lemah diri]
Aku punya kesalahan ini saat melakukan hal ini:
NSMutableDictionary *aDictionary=[[NSMutableDictionary alloc] initWithObjectsAndKeys:<#(nonnull id), ...#>, nil]; //with 17 objects and keys
Itu pergi ketika saya kembali ke:
NSMutableDictionary *aDictionary=[[NSMutableDictionary alloc] init];
[aDictionary setObject:object1 forKey:@"Key1"]; //17 times