我真的无法弄清楚为什么我有这个bug。
首先,调试器停在机器代码处
线程也没有显示任何内容。程序实际上没有代码停止
所以它与_dispatch_worker_thread有关
那是什么?
我怎么能调试这个?我应该回滚吗?
当您运行CPU上不支持的(向量)扩展时,会发生这种崩溃。
例如,在“project-settings / build-settings / Code Generation”下的xcode 5中,将“Enable Additional Vector extensions”设置为“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))];