134

例外コードの意味は何EXC_I386_GPFLTですか?

状況によって意味が変わる?

その場合、EXC_BAD_ACCESS例外コードで例外タイプを参照していますEXC_I386_GPFLT

cblas_zgemm()プログラムはXcode 5.0.1で開発されており、BLASライブラリを扱っています。

どうもありがとうございました!

4

15 に答える 15

127

EXC_I386_GPFLT は、「許可されていないことをした」ことを x86 が伝える方法である「一般保護違反」を指していることは間違いありません。通常、メモリ境界外にアクセスすることを意味するわけではありませんが、コードが境界外になり、何らかの保護違反を引き起こすような方法で不正なコード/データが使用される可能性があります。

残念ながら、より多くのコンテキストがなければ、問題が何であるかを正確に把握するのは難しい場合があります.AMD64プログラマーズマニュアル、2005年のVol 2には27の異なる原因がリストされています.すべてのアカウントで、8年後にいくつか追加された可能性がありますもっと。

64 ビット システムの場合、もっともらしいシナリオは、コードが「非標準ポインター」を使用しているということです。つまり、64 ビット アドレスは、アドレスの上位 16 ビットが存在しないような方法で形成されていることを意味します。下位 48 ビットの先頭のすべてのコピー (つまり、アドレスの上位 16 ビットは、16 ビットのすぐ下のビットに基づいて、すべて 0 またはすべて 1 でなければなりません)。このルールは、アーキテクチャが「アドレス範囲内の有効なビット数を安全に拡張できる」ことを保証するために設けられています。これは、コードがポインタデータを他のもので上書きしているか、ポインタ値を読み取るときに範囲外になっていることを示しています。

別の考えられる原因は、SSE レジスターへのアライメントされていないアクセス、つまり、16 バイトでアライメントされていないアドレスから 16 バイトの SSE レジスターを読み取ることです。

他にも考えられる理由はたくさんありますが、それらのほとんどは、32 ビットまたは 64 ビット OS では「通常の」コードでは実行できないことが関係しています (無効なセレクター インデックスでセグメント レジスタをロードしたり、 MSR (モデル固有のレジスタ))。

于 2013-10-29T07:34:41.020 に答える
19

単体テスト中になぜこれが表示されたのか疑問に思いました。

を含むプロトコルにメソッド宣言を追加しましたthrows。しかし、潜在的に投げる方法は、その特定のテストでは使用されませんでした. テストで Zombies を有効にするのは大変な作業のように思えました。

⌘K クリーンでうまくいったことがわかりました。それが実際の問題を解決するとき、私はいつもびっくりします。

于 2015-10-10T13:44:07.433 に答える