なぜこのバグがあるのか本当にわかりません。
まず、デバッガーはマシンコードで停止します
スレッドも何も表示しません。プログラムは実際にはコードなしで停止します
つまり、それは_dispatch_worker_threadと関係があります
それは何ですか?
どうすればこれをデバッグできますか?ロールバックするだけでいいですか?
この種のクラッシュは、CPUでサポートされていない(ベクトル)拡張機能を実行しているときに発生します。
たとえば、xcode5の「project-settings/build-settings/Code Generation」で、「Enable AdditionalVectorextensions」を「AVX2」に設定します。実行可能ファイルをビルドします。
今それを実行します:
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
のバグですか。ここに?
最終的に、元の質問のコンテキストでは、失敗しているライブラリ関数がアサーションにヒットしたと思われます。
私の場合、viewDidLoadのcontentSize
にUITextView
のオブザーバーを追加していましたが、削除していませんでした。 viewDidAppear
に追加してから、viewWillDisappear
から削除することで修正しました。見つけるのはとても面倒でした:(
viewDidAppear
にオブザーバーを追加します
[self.textViewMessage addObserver:self
forKeyPath:NSStringFromSelector(@selector(contentSize))
options:NSKeyValueObservingOptionNew
context:nil];
viewWillDisappear
のオブザーバーを削除します
[self.textViewMessage removeObserver:self forKeyPath:NSStringFromSelector(@selector(contentSize))];