【问题标题】:How to handle BAD_ACCESS signal handling in objective-c如何在objective-c中处理BAD_ACCESS信号处理
【发布时间】:2015-04-15 13:28:32
【问题描述】:

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

到目前为止我尝试的是

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

谁能指出我做错了什么?或任何处理异常和信号的建议..

【问题讨论】:

    标签: objective-c macos exception signal-handling


    【解决方案1】:

    在开始自己处理信号之前,您可能需要阅读安全信号处理。 man sigaction 是第一次开始。请参阅注释“以下函数是 [...] 异步信号安全的”。

    例如,在信号处理程序中,您不能使用 Objective-C 或 NSLog。这可能是您的信号处理程序无法按预期工作的原因。

    像往常一样处理低级的东西,Mike Ash has a nice article

    【讨论】:

      【解决方案2】:

      在您的 AppDelegate.m 中编写以下方法

      //Function to Caught Exceptions
      - (void)installUncaughtExceptionHandler
      {
          InstallUncaughtExceptionHandler();
      }
      

      并在AppDelegate.m

      applicationDidFinishLaunching方法中这样调用上述方法
      [self performSelector:@selector(installUncaughtExceptionHandler) withObject:nil afterDelay:0];
      

      【讨论】:

      • 请解释以这种延迟方式安装异常处理程序的意义。
      • @NikolaiRuhe 请再看一遍代码,因为当我将 0 传递给参数时,它没有延迟安装异常处理程序。它只是调用在另一个线程上安装的方法。
      • 问题是关于不受线程影响的信号处理。
      猜你喜欢
      • 1970-01-01
      • 2021-09-07
      • 2011-09-23
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多