2012-11-10 4 views
7

내가 처음 맥 앱 스토어 앱에 대한 충돌 보고서를 아래에 표시했습니다 (ITC에서). 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

을 자주 차 잎을 읽고 경계하지만,이 경우, 무슨 일이 있었는지 꽤 분명 코드에없는 스택 프레임 읽기.

을 나는거야 충돌 기록을 읽으 려다가 내가 따라갈 때 번역해라.

스택 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 

. 이것은 프로세스가 충돌 한 곳입니다.

그래서 개요보기에서 메시지를 대리인에게 보내려고하면 오류가 발생했습니다.

  1. 문제의보기가 개요보기가 아닌 비 개요 테이블이다 :

    이에서

    , 우리는 세 가지 사실을 유도 할 수있다. 일반적인 프레임 뷰는 NSOutlineView가 아닙니다. 이것만으로도 관련된 뷰를 식별 할 수 있습니다. 그러나 그렇지 않은 경우에는 더 크지 않습니다. 좁혀 질 수있는 또 다른 사실이 있기 때문입니다.

  2. 문제의 개요보기에는 대리인이 있습니다. 이것만으로도 관련 개요보기를 식별 할 수 있지만 문제가보기에 전혀 포함되어 있지 않기 때문에 큰 문제는 없습니다.
  3. 보기의 대리자 인 개체가 불충분하게 소유되어있는 것이 문제입니다. 개요보기가 스택 추적에서 본 메시지를 보낼 수 있기 전에 조기에 사망합니다.

인물의 좀비 템플릿을 사용하면 개요보기에서 대화하려는 개체를 확인하고 해당 개체의 기록을 검토하여 해당 개체를 죽인 불균형 또는 불균형 릴리스를 찾을 수 있습니다. 그 객체의 강력한 소유권을 어딘가에 추가해야 할 것입니다.

+0

당신의 인상적인 설명에 대해 정말로 감사 드리며이 로그를 더 잘 이해할 수있게되었습니다. –

+4

피터 (Peter), 이것은 내가 만난 가장 유용한 게시물 중 하나입니다! 이것은 내게 일어난 일입니다. 그러나 개요보기가 아닌 일반 테이블보기가 있습니다. 내 오류는 설정하는 것을 잊었습니다. ARC에서 내 View Controller를 해제하기 전에 내 테이블 뷰의 델리게이트와 데이터 소스를 무효화하십시오. –

+0

스택 추적에 강한 '_delegate_'단서가 없었지만 델리게이트 문제였습니다. 탐색 스택에 넣고 탭 막대의 위임자로 설정 한 다음 해당보기 컨트롤러를 팝업하기 전에 위임자를 nil로 설정하는 것을 잊었습니다. 그런 다음 탭 막대를 두드렸을 때보기 컨트롤러에 액세스하기 때문에 더 이상 존재하지 않습니다. 나에게는 예외적 인 경우는 없다는 것이 이상하다. –