Vorrei registrare la traccia della chiamata durante determinati punti, come asserzioni non riuscite o eccezioni non rilevate.
Vorrei registrare la traccia della chiamata durante determinati punti, come asserzioni non riuscite o eccezioni non rilevate.
Risposte:
NSLog(@"%@",[NSThread callStackSymbols]);
Questo codice funziona su qualsiasi thread.
backtrace/backtrace_symbols
direttamente
La risposta di n13 non ha funzionato del tutto - l'ho modificata leggermente per trovare questo
#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;
}
}
NSLog(@"[Error] - %@ %@", exception.name, exception.reason);
Se lo desideri, puoi aggiungere anche l'eccezione effettiva
Cocoa registra già la traccia dello stack su eccezioni non rilevate sulla console sebbene siano solo indirizzi di memoria non elaborati. Se vuoi informazioni simboliche nella console, c'è un codice di esempio di Apple.
Se vuoi generare una traccia dello stack in un punto arbitrario nel tuo codice (e sei su Leopard), vedi la pagina man backtrace. Prima di Leopard, dovevi effettivamente scavare nello stack di chiamate stesso.
Questo ti dice praticamente cosa fare.
Fondamentalmente è necessario impostare la gestione delle eccezioni delle applicazioni per accedere, qualcosa del tipo:
#import <ExceptionHandling/NSExceptionHandler.h>
[[NSExceptionHandler defaultExceptionHandler]
setExceptionHandlingMask: NSLogUncaughtExceptionMask |
NSLogUncaughtSystemExceptionMask |
NSLogUncaughtRuntimeErrorMask]
Per eccezioni, è possibile utilizzare il membro NSStackTraceKey del dizionario userInfo dell'eccezione per eseguire questa operazione. Vedi Controllo della risposta di un programma alle eccezioni sul sito Web di Apple.
backtrace
ebacktrace_symbols
; vedere la manpage backtrace (3).