如何理解此崩溃日志

时间:2012-11-10 22:10:47

标签: objective-c macos cocoa crash-reports symbolicatecrash

我(在ITC中)下面提供了我的第一个Mac App Store应用程序的崩溃报告。 使用基于Stackoverflow的知识我试图象征这个日志,但是(使用atos和otool)我只能读取最后一行(20)(意味着start (in My App) + 52)。 我真的不知道如何解释上面的行,以及如何找到崩溃的原因。

Process:         My App [270]
Identifier:      com.mycompany.myapp
Version:         1.0.0 (1.0.0)
App Item ID:     568750000
App External ID: 11410000
Code Type:       X86-64 (Native)
Parent Process:  launchd [143]
User ID:         501

Date/Time:       2012-11-07 19:21:11.365 -0200
OS Version:      Mac OS X 10.8.2 (12C60)
Report Version:  10

Per-App Interval Since Last Report:  1232 sec
Per-App Crashes Since Last Report:   1

Crashed Thread:  0  Dispatch queue: com.apple.main-thread

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: EXC_I386_GPFLT


Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   libobjc.A.dylib                 0x00007fff877a5256 objc_msgSend + 22
1   com.apple.AppKit                0x00007fff8dac6e27 -[NSOutlineView _delegate_isGroupRow:] + 66
2   com.apple.AppKit                0x00007fff8da46878 -[NSTableView _isGroupRow:] + 81
3   com.apple.AppKit                0x00007fff8da41fad -[NSTableView _isSourceListGroupRow:] + 56
4   com.apple.AppKit                0x00007fff8da418e8 -[NSTableView rectOfRow:] + 288
5   com.apple.AppKit                0x00007fff8da5b3cb _NSTVVisibleRowsForUpdate + 296
6   com.apple.AppKit                0x00007fff8da5aa85 -[NSTableRowData _unsafeUpdateVisibleRowEntries] + 96
7   com.apple.AppKit                0x00007fff8da5a8a1 -[NSTableRowData updateVisibleRowViews] + 119
8   com.apple.AppKit                0x00007fff8da6e463 -[NSTableRowData _idleUpdateVisibleRows] + 66
9   com.apple.CoreFoundation        0x00007fff87547da4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 20
10  com.apple.CoreFoundation        0x00007fff875478bd __CFRunLoopDoTimer + 557
11  com.apple.CoreFoundation        0x00007fff8752d099 __CFRunLoopRun + 1513
12  com.apple.CoreFoundation        0x00007fff8752c6b2 CFRunLoopRunSpecific + 290
13  com.apple.HIToolbox             0x00007fff830a30a4 RunCurrentEventLoopInMode + 209
14  com.apple.HIToolbox             0x00007fff830a2e42 ReceiveNextEventCommon + 356
15  com.apple.HIToolbox             0x00007fff830a2cd3 BlockUntilNextEventMatchingListInMode + 62
16  com.apple.AppKit                0x00007fff8d8d8613 _DPSNextEvent + 685
17  com.apple.AppKit                0x00007fff8d8d7ed2 -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 128
18  com.apple.AppKit                0x00007fff8d8cf283 -[NSApplication run] + 517
19  com.apple.AppKit                0x00007fff8d873cb6 NSApplicationMain + 869
20  com.mycompany.myapp             0x000000010f29ce1c 0x10f29b000 + 7708

1 个答案:

答案 0 :(得分:39)

读取代码中不存在的堆栈框架通常会在阅读茶叶边框时出现问题,但在这种情况下,发生的情况非常清楚。

我将把你的崩溃日志读给你,随着时间的推移进行翻译。

堆栈是自下而上构建的(就像现实世界中的堆栈一样)。我会切入追逐:

10  com.apple.CoreFoundation        0x00007fff875478bd __CFRunLoopDoTimer + 557
9   com.apple.CoreFoundation        0x00007fff87547da4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 20

计时器被解雇。

8   com.apple.AppKit                0x00007fff8da6e463 -[NSTableRowData _idleUpdateVisibleRows] + 66
7   com.apple.AppKit                0x00007fff8da5a8a1 -[NSTableRowData updateVisibleRowViews] + 119
6   com.apple.AppKit                0x00007fff8da5aa85 -[NSTableRowData _unsafeUpdateVisibleRowEntries] + 96
5   com.apple.AppKit                0x00007fff8da5b3cb _NSTVVisibleRowsForUpdate + 296

在此计时器中(可能设置为在空闲时间内触发),表视图会尝试更新其对哪些行可见的了解。

(最后一帧是澄清它正在更新哪些行是可见的,而不是更新可见的行。你可以从函数名称的措辞来判断。)

4   com.apple.AppKit                0x00007fff8da418e8 -[NSTableView rectOfRow:] + 288

要确定行是否可见,视图需要确定该行在其边界内的位置(可能与滚动视图中的可见矩形相交)。

为此,表视图试图找出该行的特征:

3   com.apple.AppKit                0x00007fff8da41fad -[NSTableView _isSourceListGroupRow:] + 56

是源列表组行吗?

2   com.apple.AppKit                0x00007fff8da46878 -[NSTableView _isGroupRow:] + 81

是否有任何群组行?

1   com.apple.AppKit                0x00007fff8dac6e27 -[NSOutlineView _delegate_isGroupRow:] + 66

我们问代表。

0   libobjc.A.dylib                 0x00007fff877a5256 objc_msgSend + 22

尝试发送消息。这是您的流程崩溃的地方。

因此,在大纲视图尝试向其委托发送消息时发生了崩溃。

由此,我们可以得出三个事实:

  1. 有问题的视图是大纲视图,而不是非大纲的表视图。 (框架#1证明了这一点。常规表格视图不是NSOutlineView。)仅此一项可以识别所涉及的视图,但如果没有,则没有大问题,因为我们有另一个事实可能会缩小它。
  2. 有问题的大纲视图有一个代表。仅这一点就可以确定所涉及的大纲视图,但如果没有,则没有大问题,因为问题根本不在视图中。
  3. 问题是作为视图委托的对象拥有不足。它在大纲视图发送给我们在堆栈跟踪中看到的消息之前过早死亡。
  4. 使用Instruments的Zombies模板来确定大纲视图尝试与之对话的对象,并查看该对象的历史记录以查找杀死它的过度或不平衡的版本。您可能需要在某处添加该对象的强大所有权。