2010-02-17 14 views
5

Teraz, gdy jeden z moich potwierdzeń jest wywoływany w Xcode, otrzymuję wiadomość potwierdzającą i zrzut stosu, który jest pełen liczb, które nie są dla mnie zbyt znaczące.Xcode - śledzenie stosu połączeń w assert?

Aby uzyskać ślad stosu wywołań, muszę przeprowadzić debugowanie aplikacji i uruchomić ją do punktu, w którym wystąpił asertywność, i mam nadzieję, że będzie to ponownie potwierdzać. W przypadku błędów, które są w 100% powtarzalne, nie jest to zbyt duży problem, ale wciąż jest stratą czasu.

Byłoby znacznie lepiej, gdybym dostał ślad stosu wywołań za każdym razem, gdy trafienie jest trafione.

Jak zdefiniować makro assert, które zrzuci śledzenie stosu wywołań w Xcode?

Odpowiedz

5

NSThread ma metodę klasy o nazwie callStackSymbols (i NSException ma metodę instancji o tej samej nazwie). Niestety, nie używam regularnie wyjątków i nie regularnie używam znaków (nie jestem dumny z żadnego z tych faktów), więc nie jestem pewien, co powinien zrobić makropolecenie.

#define AssertWithStackSymbols(x) \ 
do { \ 
    if (!(x)) { \ 
     NSLog (@"%s failed assertion\n%@", #x, [NSThread callStackSymbols]); \ 
     abort(); \ 
    } \ 
} while(0) 

Albo, jak KennyTM uprzejmie wskazał, można użyć backtrace_symbols. Istnieje nawet metoda, która wysyła symbole bezpośrednio do deskryptora pliku, backtrace_symbols_fd.

#define AssertWithStackSymbols(x) \ 
do { \ 
    if (!(x)) { \ 
     void *stack[128]; \ 
     int count; \ 
     fputs (#x " failed assertion.\n", stderr); \ 
     count = backtrace (stack, sizeof stack/sizeof (void *)); \ 
     backtrace_symbols_fd (stack, count, STDERR_FILENO); \ 
    } \ 
while (0) 
+0

O, zapomniałem wspomnieć: metoda 'callStackSymbols' jest dostępna tylko w systemie Mac OS X 10.6. – dreamlax

+1

Na OS X 10.5 i iPhoneOS można użyć 'backtrace_symbols (3)'. – kennytm

1

Na iOS 4.x można użyć [NSThread callStackSymbols].

Powiązane problemy