2012-11-10 15 views
7

Dostałem (w ITC) poniżej przedstawiony raport o awarii mojej pierwszej aplikacji na Mac App Store. Posługując się wiedzą opartą na Stackoverflow próbowałem oznaczyć ten log, ale (używając atos i otool) mogłem tylko odczytać ostatnią (20) linię (co oznacza start (in My App) + 52. Naprawdę nie wiem jak interpretować linie powyżej i jak znaleźć przyczynę awarii.Jak rozumieć ten dziennik awarii

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

To błąd segmentacji, prawdopodobnie nie wystąpił w jednej z Twoich metod. Czyli w jakiś sposób opuściłeś widok tabeli w niespójnym stanie. –

+0

Dziękuję za pomoc, ale mam dużą liczbę TableView i OutlineView w mojej aplikacji. Bez identyfikacji okna ten raport jest dla mnie kompletnie bezużyteczny (podobnie jak inne raporty z osx :() –

Odpowiedz

38

czytanie ramek stosu, które nie są w kodzie często graniczy z wróżenie z fusów, ale w tym przypadku, to jest całkiem jasne, co się stało.

jadę aby odczytać ci dziennik awarii, tłumacząc, gdy idę.

Stos i zbudowane od dołu (tak jak stosy w świecie rzeczywistym). Ja do sedna:

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

Czasomierz zwolniony.

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 

W tym czasowy (który jest prawdopodobnie ustawiony na ogień w czasie bezczynności), widok tabeli próbuje zaktualizować swoją wiedzę z których wiersze są widoczne.

(Ostatnia klatka jest ten, który wyjaśnia, że ​​to uaktualnienie który rzędy są widoczne, nie aktualizowanie wierszy, które są widoczne. Można powiedzieć to z brzmienia nazwy funkcji.)

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

Aby określić, czy wiersz jest widoczny, widok musi ustalić, gdzie znajduje się ten wiersz (prawdopodobnie przecina się z widocznym prostokątem w widoku przewijania).

Pod tym celu, widok tabeli próbuje dowiedzieć się, charakterystykę tego wiersza:

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

Czy jest to lista źródłowa grupa wiersz?

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

Czy każdy wiersz grupa w ogóle?

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

Zapytajmy delegata.

0 libobjc.A.dylib     0x00007fff877a5256 objc_msgSend + 22 

próbuje wysłać wiadomość. To tutaj spowodował awarię twojego procesu.

Tak, awaria wystąpiła, gdy widok konspektu próbował wysłać wiadomość do swojego uczestnika.

od tego, możemy czerpać trzy fakty:

  1. Wgląd w pytaniu jest widokiem zarys, a nie non-zarys widoku tabeli. (Dowodzi tego ramka nr 1. Standardowy widok tabeli nie jest widokiem NSOutlineView). Samo to może identyfikować dany widok, ale jeśli nie, to nie ma wielkiego, ponieważ mamy inny fakt, który może go zawęzić.
  2. Omawiany widok konspektu ma delegata. Samo to może zidentyfikować widok konspektu, ale jeśli nie, to nie ma problemu, ponieważ problem nie dotyczy wcale widoku.
  3. Problem polega na tym, że obiekt będący delegatem widoku jest niewystarczająco własnością. Umiera przedwcześnie, zanim widok konspektu może wysłać wiadomość, którą widzieliśmy w zapisie stosu.

Użyj szablonu Zombies Instruments, aby określić, z jakiego obiektu ma być rozmawiany widok konspektu, i przejrzyj historię tego obiektu, aby znaleźć nieuzasadnione lub niezrównoważone wydanie, które go zabiło. Prawdopodobnie musisz dodać silne prawo własności do tego obiektu.

+0

Naprawdę dziękuję za imponujące wyjaśnienie.To pozwoliło mi lepiej zrozumieć ten dziennik. Teraz spróbuję znaleźć gdzie błąd to jest –

+4

Peter, jest to jeden z najbardziej pomocnych postów, jakie kiedykolwiek spotkałem! Dokładnie to samo działo się ze mną, jednak z prostym widokiem tabeli, zamiast widoku konspektu Mój błąd polegał na tym, że zapomniałem ustawić delegata widoku mojej tabeli i źródło danych do zera przed zezwoleniem ARC na zwolnienie kontrolera widoku –

+0

Nie miałem silnej wskazówki "_delegate_" w moim stosie śledzenia, ale ostatecznie okazało się, że jest to kwestia delegata. stos nawigacyjny i ustawić go jako delegata paska kart, a następnie zapomniałem ustawić delegata na zero przed wyskoczeniem tego kontrolera widoku, a kiedy kliknąłem na pasku kart, boom, ponieważ jest on powiązany z dostępem do kontrolera widoku, t już nie istnieje. Dla mnie to dziwne, że w tych przypadkach nie ma wyjątku. –