我正在尝试处理崩溃,当发生崩溃时,我想将一些日志存储到文件中。
到现在为止我试过的是
void InstallUncaughtExceptionHandler()
{
NSSetUncaughtExceptionHandler(&HandleException);
signal(SIGABRT, SignalHandler);
signal(SIGILL, SignalHandler);
signal(SIGSEGV, SignalHandler);
signal(SIGFPE, SignalHandler);
signal(SIGBUS, SignalHandler);
signal(SIGPIPE, SignalHandler);
}
static void SignalHandler (int signo) {
//...
NSLog(@"\n Inside Signal Handler Method...");
}
void HandleException(NSException *exception) {
NSLog(@"CRASH: %@", exception);
NSLog(@"Stack Trace: %@", [exception callStackSymbols]);
// Internal error reporting
}
因此,当我得到BAD_ACCESS异常时,控件没有进入信号处理程序方法。
我在AppDelegate的applicationDidFinishLaunching方法中调用此InstallUncaughtExceptionHandler()方法
有谁能说我做错了什么?或任何处理例外和信号的建议..
答案 0 :(得分:0)
在开始处理信号之前,您可能需要阅读安全信号处理。 man sigaction
是第一个开始。请参阅注释"以下功能是[...] async-signal safe"。
在信号处理程序中,您不能使用Objective-C或NSLog。这可能是您的信号处理程序无法按预期工作的原因。
因为使用低等级的东西,Mike Ash has a nice article。
答案 1 :(得分:-1)
在AppDelegate.m中编写以下方法
//Function to Caught Exceptions
- (void)installUncaughtExceptionHandler
{
InstallUncaughtExceptionHandler();
}
在 appDelegate.m 的 applicationDidFinishLaunching 方法中以这种方式调用上述方法
[self performSelector:@selector(installUncaughtExceptionHandler) withObject:nil afterDelay:0];