2010-02-17 19 views
5

Ahora cuando una de mis afirmaciones se activa en Xcode, aparece el mensaje afirmar y un volcado de la pila, que está lleno de números que no son muy significativos para mí.Xcode: seguimiento de la pila de llamadas en assert?

Para obtener un rastro de la pila de llamadas, me requiere depurar la aplicación y ejecutarla hasta el punto donde se produjo la afirmación, y espero que vuelva a afirmarse. Para los errores que son 100% reproducibles, este no es un gran problema, pero sigue siendo una pérdida de tiempo.

Sería mucho mejor si obtuviera un seguimiento de la pila de llamadas cada vez que se golpea una afirmación.

¿Cómo se define una macro assert que va a volcar un seguimiento de la pila de llamadas en Xcode?

Respuesta

5

tiene un método de clase llamado callStackSymbols (y NSException tiene un método de instancia del mismo nombre). Lo siento, no uso regularmente las excepciones y tampoco uso las afirmaciones regularmente (no estoy orgulloso de ninguno de los hechos), así que no estoy seguro de qué debería hacer la macro de aserción.

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

O, como KennyTM amablemente señaló, puede utilizar backtrace_symbols. Incluso hay un método que envía los símbolos directamente a un descriptor de archivo, 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

Ah, se olvidó de mencionar: el método 'callStackSymbols' solo está disponible en Mac OS X 10.6. – dreamlax

+1

En OS X 10.5 e iPhoneOS puede usar 'backtrace_symbols (3)'. – kennytm

1

En iOS 4.x puede usar [NSThread callStackSymbols] entonces.

Cuestiones relacionadas