2

我的应用程序出现 EXC_BAD_ACCESS 崩溃,我在可执行方案上启用了 NSZombie 以进行调试。即使启用了 NSZombie,我仍然会遇到此崩溃。主要嫌疑人是导致此错误的线程(不是主线程)。我在我的代码中做一些 kvo 的东西。它似乎来自它。我找不到导致问题的地方。这是线程的回溯。谁能告诉我如何确定问题?任何线索或调试技巧将不胜感激。

更新:我尝试运行分析器,但程序在分析器上运行时刚刚停止并自行关闭。没有消息什么都没有……只是默默地关闭,录音停止了。我不太擅长看分析仪,但谁能告诉我在哪里看?

* thread #9: tid = 0x2803, 0x00cfdb3e Foundation`__block_global_4 + 420, stop reason = EXC_BAD_ACCESS (code=2, address=0x20)
    frame #0: 0x00cfdb3e Foundation`__block_global_4 + 420
    frame #1: 0x00c5b9d7 Foundation`-[NSObject(NSKeyValueObservingPrivate) _changeValueForKey:key:key:usingBlock:] + 675
    frame #2: 0x00c5b72e Foundation`-[NSObject(NSKeyValueObservingPrivate) _changeValueForKey:usingBlock:] + 63
    frame #3: 0x00cfd994 Foundation`____NSOQDelayedAttachPendingOperations_block_invoke_0 + 98
    frame #4: 0x00c5b9d7 Foundation`-[NSObject(NSKeyValueObservingPrivate) _changeValueForKey:key:key:usingBlock:] + 675
    frame #5: 0x00c5b72e Foundation`-[NSObject(NSKeyValueObservingPrivate) _changeValueForKey:usingBlock:] + 63
    frame #6: 0x00c84e7b Foundation`__NSOQDelayedAttachPendingOperations + 156
    frame #7: 0x01615014 libdispatch.dylib`_dispatch_client_callout + 14
    frame #8: 0x01604fd6 libdispatch.dylib`_dispatch_after_timer_callback + 28
    frame #9: 0x01615014 libdispatch.dylib`_dispatch_client_callout + 14
    frame #10: 0x0160c8b7 libdispatch.dylib`_dispatch_source_latch_and_call + 219
    frame #11: 0x01608405 libdispatch.dylib`_dispatch_source_invoke + 322
    frame #12: 0x01606280 libdispatch.dylib`_dispatch_root_queue_drain + 231
    frame #13: 0x01606450 libdispatch.dylib`_dispatch_worker_thread2 + 39
    frame #14: 0x995eee12 libsystem_c.dylib`_pthread_wqthread + 441
4

1 回答 1

1

跨线程使用 KVO 真的非常危险。在这种情况下,看起来您正在修改线程 #9 中的值,这会触发那里的 KVO 消息。然而,如果你的观察者依赖于在主线程中(例如,它对用户界面做任何事情,或者它没有保护它访问的任何数据),你的应用程序将会崩溃。

您是否一次一行地浏览应用程序以查看哪一行导致崩溃?

于 2014-01-06T01:12:30.407 回答