如何在objective-c中处理BAD_ACCESS信号处理

时间:2015-04-15 13:28:33

标签: objective-c macos exception signal-handling

我正在尝试处理崩溃,当发生崩溃时,我想将一些日志存储到文件中。

到现在为止我试过的是

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()方法

有谁能说我做错了什么?或任何处理例外和信号的建议..

2 个答案:

答案 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];