2009-09-03 11 views
8

Xcode/cel c naprawdę nie drukuje użytecznego śladu stosu. Moja aplikacja gdzieś się zawiesza, a ta cholerna rzecz daje mi tylko numery takie jak 45353453, 34524323, 6745345353, 457634524234. Nie przydatne w ogóle.Łatwy sposób wydrukowania bieżącego śladu stosu aplikacji?

Więc chcę zrobić NSLog(); na początku KAŻDEJ metody mam w całej mojej aplikacji. Ale może jest prostszy sposób, aby dowiedzieć się prawdziwego śladu stosu, po ludzku czytelny? Nie tylko podczas uruchamiania aplikacji czy awarii, ale przez cały czas, przy każdej aktywności, która się dzieje? Pomogłoby to w debugowaniu.

+0

można śledzić ślad stosu w debugger, powinna ona dostać się do ostatniego wywołania metody przed katastrofą myślę – Daniel

+0

Nie, informacje o debuggerze nie są naprawdę pomocne. –

+1

Dlaczego informacje dotyczące debugera nie są przydatne? Jeśli uruchomisz aplikację w debugerze i ulegnie awarii, debugger powinien przedstawić ładną ścieżkę stosu, którą możesz cofnąć, aby zobaczyć każdą wywołaną linię. Jeśli twoja aplikacja zatrzymuje się na wyjątku, zobacz odpowiedź alex_c, aby dowiedzieć się, jak to debugować. –

Odpowiedz

1

Naprawdę nie ma sposobu, aby to zrobić w sposób niezawodny z poziomu aplikacji. Jeśli twoja aplikacja się zawiesza i nie daje symboli, to brzmi jak twoja wersja z usuniętą wersją, a nie wersja debugowania?

Jeśli masz unstripped wersję siedzi wokół, można skorelować między tymi liczbami i rzeczywistą nazwę ramki stosu używając komendy atos (patrz man atos w Terminalu lub poszukać atos w dokumentacji Xcode lub Google).

Prawdopodobnie nie chcesz rejestrować stosu wszystkich wywołań metod. Ilość informacji szybko stałaby się przytłaczająca. I nie powinno być tajemnicą, dlaczego większość metod w twojej aplikacji jest wywoływana (chociaż zajmie trochę czasu, aby zrozumieć, dlaczego interfejs między UIKit i twoją aplikacją działa tak, jak działa).

4

Coś takiego może być pomocne dla Ciebie, jak również


@implementation UIApplication (MyCategory) 

+ (void)logStackTrace { 
    @try { 
     [[NSException exceptionWithName:@"Stack Trace" reason:@"Testing" userInfo:nil] raise]; 
    } 
    @catch (NSException *e) { 
     NSLog(@"%@", [e callStackSymbols]); 
    } 
} 

@end 
+8

Jest to przydatne przed iOS 4. Użyj [NSThread callStackSymbols] dla iOS 4+. –

Powiązane problemy