Eu gostaria de registrar o rastreamento de chamadas durante determinados pontos, como afirmações com falha ou exceções não capturadas.
Eu gostaria de registrar o rastreamento de chamadas durante determinados pontos, como afirmações com falha ou exceções não capturadas.
Respostas:
NSLog(@"%@",[NSThread callStackSymbols]);
Este código funciona em qualquer thread.
backtrace/backtrace_symbols
diretamente
A resposta de n13 não funcionou muito bem - eu a modifiquei um pouco para criar essa
#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 quiser que a exceção real também
O cacau já registra o rastreamento de pilha em exceções não capturadas no console, embora sejam apenas endereços de memória bruta. Se você quiser informações simbólicas no console, há algum código de amostra da Apple.
Se você deseja gerar um rastreamento de pilha em um ponto arbitrário no seu código (e você está no Leopard), consulte a página de manual do backtrace. Antes do Leopard, você realmente precisava vasculhar a própria pilha de chamadas.
Isso praticamente diz o que você deve fazer.
Essencialmente, você precisa configurar o tratamento de exceções dos aplicativos para registrar, algo como:
#import <ExceptionHandling/NSExceptionHandler.h>
[[NSExceptionHandler defaultExceptionHandler]
setExceptionHandlingMask: NSLogUncaughtExceptionMask |
NSLogUncaughtSystemExceptionMask |
NSLogUncaughtRuntimeErrorMask]
Para exceções, você pode usar o membro NSStackTraceKey do dicionário userInfo da exceção para fazer isso. Consulte Controle da resposta de um programa a exceções no site da Apple.
backtrace
ebacktrace_symbols
; consulte a página de manual backtrace (3).