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

问题描述 投票:21回答:3

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

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

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

所以它与_dispatch_worker_thread有关

那是什么?

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

objective-c xcode4.3
3个回答
8
投票

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

例如,在“project-settings / build-settings / Code Generation”下的xcode 5中,将“Enable Additional Vector extensions”设置为“AVX2”。构建可执行文件。

现在运行它:

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

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

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


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))];
© www.soinside.com 2019 - 2024. All rights reserved.