2010-02-17 16 views
5

In questo momento quando uno dei miei asseriti viene attivato in Xcode, ottengo il messaggio assert, e un dump dello stack, che è pieno di numeri che per me non sono molto significativi.Xcode - Traccia stack di chiamata su assert?

Al fine di ottenere una traccia dello stack di chiamate, mi richiede di eseguire il debug dell'applicazione, ed eseguirlo fino al punto in cui si è verificato l'asserzione, e la speranza che afferma ancora una volta. Per bug che sono riproducibili al 100%, questo non è un problema troppo grande, ma è ancora una perdita di tempo.

Sarebbe molto meglio se ricevessi una traccia di stack di chiamate ogni volta che viene inviata un'asserzione.

Come si definisce una macro assert che eseguirà il dump di una traccia di stack di chiamate in Xcode?

risposta

5

NSThread ha un metodo di classe chiamato callStackSymbols (e NSException ha un metodo di istanza con lo stesso nome). Scusate, non uso regolarmente le eccezioni e non uso regolarmente anche gli asserzioni (non ne sono orgoglioso), quindi non sono sicuro di cosa dovrebbe fare la macro di asserzione.

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

O, come KennyTM gentilmente sottolineato, è possibile utilizzare backtrace_symbols. Esiste anche un metodo che emette i simboli direttamente su un descrittore di file, 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

Oh, ho dimenticato di menzionare: il metodo 'callStackSymbols' è disponibile solo su Mac OS X 10.6. – dreamlax

+1

Su OS X 10.5 e iPhoneOS è possibile utilizzare 'backtrace_symbols (3)'. – kennytm

1

Su iOS 4.x è possibile utilizzare [NSThread callStackSymbols] così.

Problemi correlati