2012-11-10 6 views
7

私は最初のMac App Storeアプリケーションのクラッシュレポートを(ITCで)表示しました。私は実際に上記の行を解釈する方法を知らない。私は私が唯一start (in My App) + 52を意味し、最後の(20)のラインを(読むことができました(ATOSとコマンドotoolを使用して)このログをsymbolicateしようとしましたが、StackOverflowの上に築か知識を 使用し、 クラッシュの原因を見つける方法。このクラッシュログを理解するには

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

これはセグメンテーションフォールトで、おそらくメソッドの1つでは発生していません。どういうわけか、テーブルビューが矛盾した状態になってしまいました。 –

+0

ありがとう、あなたの助けをありがとう、私は多くのTableViewとOutlineViewを私のアプリに持っています。ウィンドウを特定することなく、このレポートは私にとって完全に使用できません(osx :()からの他のレポートのように) –

答えて

38

あなたのコードに含まれていないスタックフレームを読み込み、多くの場合、茶葉を読んで国境が、この場合には、それは何が起こったのかかなり明確だ。

私は行きますよあなたのクラッシュログを読んで、私が行くように翻訳してください。

スタックi (実世界のスタックのように)上から構築されています。

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 

。これはあなたのプロセスがクラッシュした場所です。アウトラインビューは、そのデリゲートにメッセージを送信しようとしたときに

ので、クラッシュが発生しました。このことから

、我々は3つの事実を導き出すことができます。質問に

  1. ビューをアウトラインビューではなく、非アウトライン表図です。通常のテーブルビューはNSOutlineViewではありません。これだけでは関連するビューが特定されるかもしれませんが、そうでない場合は、大きなものはありません。
  2. 問題のアウトラインビューにはデリゲートがあります。これだけで、関連するアウトラインビューを識別することができますが、そうでない場合は、問題はビューにまったくないため、大したものはありません。
  3. 問題は、ビューのデリゲートであるオブジェクトの所有が不十分であることです。アウトラインビューがスタックトレースで見たメッセージを送ることができるようになる前に、それは時期尚早に終了します。

Instrumentsのゾンビテンプレートを使用して、アウトラインビューが話そうとしているオブジェクトを特定し、そのオブジェクトの履歴を調べて、それを殺した不公平または不均衡なリリースを探します。おそらく、そのオブジェクトの強い所有権をどこかに追加する必要があります。

+0

あなたの印象的な説明に本当に感謝しています。 –

+4

Peter、これは私が今までにやって来た最も役立つ記事の1つです!これはまさに私に起こっていたことですが、アウトラインビューの代わりに単純なテーブルビューを使っています。私のテーブルビューのデリゲートとデータソースをnilにしてから、ARCがビューコントローラを解放するようにします。 –

+0

スタックトレースに強い_delegate_ヒントがありませんでしたが、デリゲートの問題でした。ナビゲーションスタックを作成し、それをタブバーのデリゲートとして設定します。次に、そのビューコントローラをポップする前にデリゲートをnilに設定するのを忘れてしまいました。その後、タブバーをタップすると、ビューコントローラにアクセスしようとしているのでもう存在しません。私には、これらのケースで例外がスローされないことは奇妙です。 –

関連する問題