2012-11-10 122 views
7

我得到了(在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 
+0

這是分段錯誤,可能不會發生在您的某個方法中。所以您不知何故將表視圖置於不一致的狀態。 –

+0

感謝您的幫助,但我的應用程序中有大量的TableView和OutlineView。沒有識別窗口,這個報告對我來說是完全無法使用的(就像來自osx :()的其他報告) –

回答

38

閱讀不在你的代碼常常接近閱讀茶葉,但在這種情況下,這是很清楚發生了什麼堆棧幀。

我要去閱讀你的崩潰日誌給你,翻譯當我走。

堆棧我從底層開始建立起來(就像現實世界中的堆棧一樣)。我就切入正題:

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. 有問題的看法是一個大綱視圖,而不是一個非輪廓表視圖。 (Frame#1證明了這一點,一個普通的表格視圖不是一個NSOutlineView。)這可以確定所涉及的視圖,但是如果它不包含,那麼就沒有什麼大不了,因爲我們有另一個可能縮小範圍的事實。
  2. 有問題的大綱視圖有一個代表。僅憑這一點就可以確定涉及的大綱視圖,但如果不是這樣,則不會出現大問題,因爲問題根本不在於視圖。
  3. 問題是,該視圖委託的對象沒有足夠的擁有權。它在提綱視圖可以發送我們在堆棧跟蹤中看到的消息之前過早死亡。

使用工具的殭屍模板來確定大綱視圖試圖與哪個對象進行交談,並查看該對象的歷史記錄以查找導致該對象死亡的過度或不平衡釋放。您可能需要在某處添加該對象的強大所有權。

+0

我真的很感謝你給出的令人印象深刻的解釋,這讓我更好地理解了這個日誌,現在我將嘗試找到bug是, –

+4

彼得,這是我遇到過的最有幫助的帖子之一!這正是發生在我身上的事情,然而只是一個簡單的表格視圖,而不是一個大綱視圖。我的錯誤是我忘了設置我的表視圖的委託和數據源爲零,讓ARC釋放我的視圖控制器 –

+0

我的堆棧跟蹤中沒有強大的_delegate_'線索,但它最終成爲委託問題。導航堆棧,並將其設置爲標籤欄的委託,然後我忘記將該代理設置爲零,然後我彈出該視圖控制器,然後當我點擊標籤欄時,繁榮,因爲它綁定到視圖控制器t不再存在。對我來說,這很奇怪,在這些情況下沒有拋出異常。 –