11

私は(ITCで)私の最初のMacAppStoreアプリのクラッシュレポートを以下に示しました。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
4

1 に答える 1

45

コードに含まれていないスタック フレームの読み取りは、茶葉の読み取りに近いことがよくありますが、この場合、何が起こったかは明らかです。

クラッシュログを読み上げながら翻訳します。

スタックはボトムアップで構築されます (現実世界のスタックと同様)。私は本題に切り込みます:

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. 問題のビューはアウトライン ビューであり、非アウトライン テーブル ビューではありません。(フレーム #1 がこれを証明しています。通常のテーブル ビューは NSOutlineView ではありません。) これだけで関係するビューを特定できるかもしれませんが、そうでない場合でも、それを絞り込む可能性のある別の事実があるため、大したことではありません。
  2. 問題のアウトライン ビューにはデリゲートがあります。これだけで、関連するアウトライン ビューを特定できる場合がありますが、そうでない場合でも、問題はビューにまったくないため、大したことではありません。
  3. 問題は、ビューのデリゲートであるオブジェクトが十分に所有されていないことです。アウトライン ビューがスタック トレースで見たメッセージを送信できるようになる前に、プロセスは途中で終了します。

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

于 2012-11-11T02:11:39.740 に答える