2009-09-03 11 views
8

Xcode/objetivo c realmente no imprime un rastro de pila útil. Mi aplicación se cuelga en algún lado, y la maldita cosa me da solo números como 45353453, 34524323, 6745345353, 457634524234. No es útil en absoluto.¿Manera fácil de imprimir el seguimiento de pila actual de una aplicación?

Así que quiero hacer un NSLog(); al comienzo de TODOS los métodos que tengo en toda mi aplicación. ¿Pero tal vez hay una manera más simple de descubrir el rastro de la pila real, humanamente legible? No solo en el lanzamiento o bloqueo de la aplicación, sino todo el tiempo, en cada actividad que ocurre. Ayudaría a la depuración mucho.

+0

se puede seguir la traza de la pila en el depurador, debe llevará a la última llamada al método antes del accidente, creo – Daniel

+0

No, la información del depurador no es realmente útil. –

+1

¿Por qué la información del depurador no es útil? Si inicia la aplicación en el depurador y se bloquea, el depurador debe presentar un buen seguimiento de la pila al que pueda volver para ver cada línea llamada. Si su aplicación se detiene en una excepción, consulte la respuesta de alex_c para saber cómo depurar eso. –

Respuesta

1

Realmente no hay una manera de hacer esto confiablemente desde dentro de la aplicación. Si su aplicación falla y no muestra símbolos, parece que ejecuta una versión de versión eliminada y no la versión de depuración.

Si tiene la versión sin pelar sentados alrededor, se puede correlacionar entre estas cifras y el nombre real del marco de pila con el comando atos (ver man atos en la Terminal o buscar atos en la documentación de Xcode o Google).

Probablemente no desee registrar la pila de todas las llamadas a métodos. El volumen de información se volvería abrumador rápidamente. Y no debería ser un misterio el motivo por el que se llama a la mayoría de los métodos en su aplicación (aunque le tomará un tiempo entender por qué la interfaz entre UIKit y su aplicación funciona de la manera en que lo hace).

4

Algo como esto podría ser útil para usted, así


@implementation UIApplication (MyCategory) 

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

@end 
+8

Esto es útil antes de iOS 4. Use [NSThread callStackSymbols] para iOS 4+. –

Cuestiones relacionadas