EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0)

时间:2012-05-24 09:39:57

标签: objective-c xcode4.3

我真的无法弄清楚为什么我有这个错误。

首先,调试器停在机器代码

enter image description here

线程也没有显示任何内容。该程序实际上没有代码停止

enter image description here

所以它与_dispatch_worker_thread

有关 那是什么?

我怎么能调试这个?我应该回滚吗?

3 个答案:

答案 0 :(得分:8)

当您运行CPU不支持的(向量)扩展时,会发生这种崩溃。

例如,在“project-settings / build-settings / Code Generation”下的xcode 5中,设置 “启用其他矢量扩展”到“AVX2”。构建可执行文件。

现在在:

上运行它
  • Intel Core i5:它会在'exc_i386_invop subcode = 0x0'时崩溃(编译器决定使用avx2的地方)。
  • 英特尔酷睿i7:它会起作用。

答案 1 :(得分:6)

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中的错误吗?

最终在原始问题的上下文中,我怀疑失败的库函数已经触及了一个断言。

答案 2 :(得分:0)

在我的情况下,我在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))];