2008-10-20 30 views

Respuesta

512
NSLog(@"%@",[NSThread callStackSymbols]); 

Este código funciona en cualquier hilo.

+13

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). –

+3

Funciona en iOS también. –

+5

solo en iOS 4.0 y superior. – Danra

6

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] 
+1

Tenga en cuenta, sin embargo, que esto sólo funcionará dentro de un manejador de excepciones registrada (no, por ejemplo, en un bloque @catch) –

9

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.

+6

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 ... void * pila de llamadas [128]; int i, frames = backtrace (callstack, 128); char ** strs = backtrace_symbols (callstack, frames); para (i = 0; i mharper

+0

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 Tertium

33

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; 
    } 
} 
+2

¡Buen acercamiento! Estuve buscando este tipo de código durante mucho tiempo. – NightFury

+1

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

+0

Puse sus mejoras en mi respuesta; Hice esto antes de ARC. Gracias. – n13

Cuestiones relacionadas