Me gustaría registrar el seguimiento de llamadas durante ciertos puntos, como las afirmaciones fallidas o las excepciones no detectadas.¿Cómo imprime un seguimiento de pila en la consola/inicie sesión en Cocoa?
Respuesta
NSLog(@"%@",[NSThread callStackSymbols]);
Este código funciona en cualquier hilo.
This casi te dice qué hacer.
Esencialmente lo que necesita para configurar el manejo de aplicaciones para registrar excepción, algo así como:
#import <ExceptionHandling/NSExceptionHandler.h>
[[NSExceptionHandler defaultExceptionHandler]
setExceptionHandlingMask: NSLogUncaughtExceptionMask |
NSLogUncaughtSystemExceptionMask |
NSLogUncaughtRuntimeErrorMask]
Tenga en cuenta, sin embargo, que esto sólo funcionará dentro de un manejador de excepciones registrada (no, por ejemplo, en un bloque @catch) –
Para excepciones, se puede utilizar el miembro de NSStackTraceKey diccionario userInfo de excepción para hacer esto. Ver Controlling a Program's Response to Exceptions en el sitio web de Apple.
Cocoa ya registra el seguimiento de la pila en excepciones no detectadas en la consola, aunque son solo direcciones de memoria sin formato. Si desea información simbólica en la consola, hay algunos sample code de Apple.
Si desea generar un seguimiento de pila en un punto arbitrario en su código (y está en Leopard), consulte la página de manual de la barra de retroceso. Antes de Leopard, en realidad tenías que buscar en la pila de llamadas.
Aparentemente disponible en iOS 4 pero no 3.2. Esto es lo que solía, descaradamente copiado de la página del manual traza inversa: # include
Al llamar en HandleException, escribe el rastro de la función del manejador, mientras que [NSException callStackSymbols] muestra la pila del lugar donde se ha producido la excepción. Pero si reemplaza "backtrace (...)" con: "NSArray arr = [ex callStackReturnAddresses]; int frames = arr.count; for (i = 0; i
respuesta tampoco funcionaba bastante de n13 - He modificado un poco para llegar a este
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char *argv[])
{
@autoreleasepool {
int retval;
@try{
retval = UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
@catch (NSException *exception)
{
NSLog(@"Gosh!!! %@", [exception callStackSymbols]);
@throw;
}
return retval;
}
}
¡Buen acercamiento! Estuve buscando este tipo de código durante mucho tiempo. – NightFury
Gah ... Apple debería hacer de esto un estándar al menos mientras desarrolla una aplicación. Un montón de direcciones de memoria es ... arcaico – Russ
Puse sus mejoras en mi respuesta; Hice esto antes de ARC. Gracias. – n13
- 1. Imprime los valores de los parámetros en la pila
- 2. forja de un seguimiento de la pila en Java
- 3. Cómo salida de un seguimiento de pila profunda en Node.js?
- 4. Encontrar el seguimiento de la pila real de Java desde un seguimiento de la pila de JavaScript
- 5. Cómo obtener el seguimiento de la pila de un hilo
- 6. ¿Cómo imprimir un seguimiento de pila en Node.js?
- 7. ¿Cómo obtengo un seguimiento de pila en OCaml?
- 8. ¿Cómo imprimir el seguimiento completo de pila en la excepción?
- 9. Excepción sin seguimiento de pila en Java
- 10. Xcode: seguimiento de la pila de llamadas en assert?
- 11. Objective-C Seguimiento de la pila
- 12. Cómo iniciar sesión seguimientos de pila en Node.js
- 13. imprime la pila posterior actual en el registro
- 14. Imprimir seguimiento de pila en la ventana de salida
- 15. ¿Qué significa esto en un seguimiento de pila?
- 16. "este" puntero se corrompe en el seguimiento de la pila
- 17. programación C# obtener Seguimiento de la pila
- 18. número de línea incorrecta en seguimiento de la pila
- 19. Error de seguimiento de pila
- 20. Excepción recurrente sin un seguimiento de pila: ¿cómo restablecerlo?
- 21. ¿Cómo se muestra el seguimiento de la pila en una excepción detectada?
- 22. Necesito ayuda para descifrar un seguimiento de la pila C#
- 23. "Excepción al cargar la aplicación" sin un seguimiento de pila
- 24. ¿Cómo obtengo el seguimiento de la pila de un objeto de excepción en Python?
- 25. ¿Cómo obtengo el seguimiento de la pila de un objeto de excepción en Python 2.7?
- 26. Dónde colocar la "pila de datos del núcleo" en una aplicación Cocoa/Cocoa Touch
- 27. Cómo registrar el seguimiento de la pila usando log4net (C#)
- 28. Log4Net - Cerrar sesión en la pila de pila de excepción solo para ciertos archivos
- 29. Imprimir la información de seguimiento de la pila de C#
- 30. Cómo obtener un seguimiento de pila en todos los subprocesos de ruby en pasajero
Nuevo en Mac OS X 10.6, que no existía cuando esta pregunta se realizó originalmente. Para pre-Snow-Leopard, use las funciones 'backtrace' y' backtrace_symbols'; ver la página de manual backtrace (3). –
Funciona en iOS también. –
solo en iOS 4.0 y superior. – Danra