【问题标题】:How do I debug a crash when the debugger won't crash and the crash log is lacking details?当调试器不会崩溃并且崩溃日志缺少详细信息时,如何调试崩溃?
【发布时间】:2012-07-13 04:15:18
【问题描述】:

(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

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

【问题讨论】:

  • 你能至少告诉我你为什么投反对票吗?我被这个难住了。
  • 我不知道为什么这被否决了。你是说只有当你没有从 Xcode 运行应用程序时才会崩溃(在这种情况下,世界上所有的断点都对你没有帮助?)。您能否更清楚地描述这一点,这可能就是您被否决的原因。
  • 另外,这可能不是完整的日志,您可能遗漏了问题中的重要信息。请参阅developer.apple.com/library/ios/technotes/tn2151/_index.html 和相关的 WWDC 视频以获取有关崩溃日志的帮助。
  • 感谢您的关注。我可能可以将其缩小到大约 2000 行代码。我想我为这个问题提供了一些背景信息,即如何在操作之前、期间和之后观察通知(NSOperation)。我可能会在这些通知中看到一些熟悉的内容,这些内容可能会导致我找到崩溃的原因。然后我可以更准确地观察代码。同时,我想我会因为提出一个我无法回答的诚实问题而受到打击。我将浏览提交日志,看看是否能找到一些东西。
  • 哦,谢谢你的第二条评论。这可能会有所帮助。

标签: objective-c debugging crash


【解决方案1】:

这并没有回答你明确的问题,但它确实回答了隐含的问题:

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

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

您可以在应用程序运行时在 XCode 中查看此内容,即使调试器未运行。

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

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

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

【讨论】:

  • 太棒了!我试过你所说的,控制台看起来像是一个我可以去寻找很多关于正在发生的事情的答案的地方。我做了一些快速实验来添加一些日志记录,看起来这将非常有帮助。当我被束缚时,我可以实时观看崩溃,但没有运行调试器。为了帮助其他人解决崩溃问题,我可能会将问题的主题更改为您对隐含问题的陈述。这比我的具体问题有更广泛的用途。
猜你喜欢
  • 2019-06-05
  • 1970-01-01
  • 1970-01-01
  • 2016-04-25
  • 1970-01-01
  • 2022-07-14
  • 2016-03-19
  • 2010-12-07
  • 1970-01-01
相关资源
最近更新 更多