web-dev-qa-db-ja.com

EXC_BAD_INSTRUCTION(コード= EXC_I386_INVOP、サブコード= 0x0)

なぜこのバグがあるのか​​本当にわかりません。

まず、デバッガーはマシンコードで停止します

enter image description here

スレッドも何も表示しません。プログラムは実際にはコードなしで停止します

enter image description here

つまり、それは_dispatch_worker_threadと関係があります

それは何ですか?

どうすればこれをデバッグできますか?ロールバックするだけでいいですか?

22
user4951

この種のクラッシュは、CPUでサポートされていない(ベクトル)拡張機能を実行しているときに発生します。

たとえば、xcode5の「project-settings/build-settings/Code Generation」で、「Enable AdditionalVectorextensions」を「AVX2」に設定します。実行可能ファイルをビルドします。

今それを実行します:

  • Intel Core i5:「exc_i386_invopsubcode = 0x0」でクラッシュします(コンパイラーがavx2を使用することを決定した場合)。
  • Intel Core i7:動作します。
8
kalmiya

EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP)__builtin_trap()の副産物です-これはGCCとclangの組み込み関数です。 x86では

    0x4dfa2:  movl   %esi, (%esp)
    0x4dfa5:  movl   %edx, 4(%esp)
    0x4dfa9:  movl   %eax, 8(%esp)
    0x4dfad:  calll  0x110ffa                  ; symbol stub for: objc_msgSend
    0x4dfb2:  cmpb   $0, %al
    0x4dfb4:  je     38
 -> 0x4dfba:  ud2    
    0x4dfbc:  movl   -32(%ebp), %eax

命令ud2はここでの原因であり、Xcodeによって特別に処理されることはありません。

ARMでは、これはtrapにコンパイルされ、XCodeでtraceブレークポイントになります。これはclangのバグですか。ここに?

最終的に、元の質問のコンテキストでは、失敗しているライブラリ関数がアサーションにヒットしたと思われます。

7
marko

私の場合、viewDidLoadのcontentSizeUITextViewのオブザーバーを追加していましたが、削除していませんでした。 viewDidAppearに追加してから、viewWillDisappearから削除することで修正しました。見つけるのはとても面倒でした:(

viewDidAppearにオブザーバーを追加します

[self.textViewMessage addObserver:self
                           forKeyPath:NSStringFromSelector(@selector(contentSize))
                              options:NSKeyValueObservingOptionNew
                              context:nil];

viewWillDisappearのオブザーバーを削除します

[self.textViewMessage removeObserver:self forKeyPath:NSStringFromSelector(@selector(contentSize))];
0
Zeeshan Tufail