1

(Draco 在下面的检查回复中提供了一个绝妙的想法。)

当应用程序委托处理自定义 URL,然后在另一个线程上启动操作时,程序中会发生此崩溃。有时操作完成,我可以在 UI 中看到结果。但它总是崩溃。

这只发生在没有调试器的情况下运行。这是崩溃日志:

0   libobjc.A.dylib                 0x37d9ff7e objc_msgSend + 22
1   CoreData                        0x3634bbd2 -[_PFManagedObjectReferenceQueue _processReferenceQueue:] + 934
2   CoreData                        0x3634efd0 _performRunLoopAction + 196
3   CoreFoundation                  0x359d2b14 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 12
4   CoreFoundation                  0x359d0d50 __CFRunLoopDoObservers + 252
5   CoreFoundation                  0x359d10aa __CFRunLoopRun + 754
6   CoreFoundation                  0x3595449e CFRunLoopRunSpecific + 294
7   CoreFoundation                  0x35954366 CFRunLoopRunInMode + 98
8   GraphicsServices                0x375f0432 GSEventRunModal + 130
9   UIKit                           0x33460cce UIApplicationMain + 1074
10  myApp                           0x000e2770 main (main.m:15)
11  myApp                           0x000e2728 start + 32

看起来它试图响应一个事件,或者更具体地说,是一个通知。如果是这样的话,我猜这个 tageted 观察者已经被移除了,或者它被添加到的对象已经被释放了。

有没有办法可以拦截通知并查看其中的内容?如果可以的话,我可能可以确定缺少哪个观察者,或者至少缩小范围。


添加了更新以解决 WrightsCS 关于所有异常断点的观点。这些都设置为 Break On Throw,所有例外。(Break on catch 也不起作用。)

在此处输入图像描述

当在调试器中运行时没有异常、没有崩溃时,这是如何工作的?

更新 2

重新命名以提供其他用户更广泛的搜索范围。是:“应用程序在没有调试器的情况下崩溃,但不是。崩溃日志告诉我什么?”

4

1 回答 1

3

这并不能回答您的明确问题,但确实回答了隐含的问题:

“当调试器不会崩溃并且崩溃日志缺少详细信息时,如何调试崩溃?”

您可以查看的不仅仅是 XCode Organizer 中的崩溃日志。查看管理器设备部分的控制台输出;查看发生崩溃的设备,然后单击控制台。您应该能够从那里看到 NSLog 语句的调试输出,即使它没有与调试器一起运行。

即使调试器没有运行,您也可以在应用程序运行时在 XCode 中查看它。

控制台显示的不仅仅是应用程序的输出,因此您必须对其进行筛选才能看到应用程序的输出。您将在相应的行上看到应用程序名称。

您可以使用为 Debug、Ad-Hoc 或 Release 编译的代码来执行此操作。用别人的应用试试。(用 Twitter 试试。你会在那里看到一些调试日志。用 Safari 试试。你可能会看到其他暂停的应用程序被 jetsam 杀死。)

您可能无法看到它崩溃的行,但您应该能够通过明智地插入一些调试代码来缩小范围。

于 2012-07-13T07:37:59.963 回答