【问题标题】:How to get signal to catch SIGABRT如何获取信号以捕获 SIGABRT
【发布时间】:2015-10-22 19:35:11
【问题描述】:

我正在尝试捕捉一个信号,以便让我们的程序优雅地退出。当我们读取一个我们无法控制的坏文件时会发生 SIGABRT。这是一个多平台程序,所以我们需要在 windows、linux 和 mac 中运行的东西。

由于某种原因,当我在 signal handling example 添加一个 signal_callback_handler 并在 Windows 中运行问题测试时,它仍然像以前一样出现中止弹出框。如何在中止弹出窗口发生之前重定向?我希望我们的程序优雅地退出。

//constructor
example::example(const string theString) 
{
   signal(SIGABRT, signal_callback_handler);
}

void example::signal_callback_handler(int sigNum)
{
   //want to handle gracefully here, but it's not getting caught
}

bool example::someMethod()
{
   FileHandle.openFile(problemDocument); //this openFile is where the SIGABRT happens
}

谢谢!

【问题讨论】:

  • answer 对您的问题有帮助吗?
  • 我看到了那个例子,Antoine Matthys 的例子和我的很相似。我正在查看它下面的示例并添加了评论。我仍然得到中止弹出窗口。我想以自己的方式退出代码。我意识到代码不能按原样继续,但它根本没有达到我在处理程序中添加的断点。
  • 你真的可以将类方法传递给signal吗?我认为这在许多系统上都行不通,因为example::signal_callback_handler() 期望通过其不可见的this 参数,而系统信号处理代码无法做到这一点。因此,根据调用约定,它可能会得到一组完全混乱的参数。如果你使用不是方法的回调函数会发生什么?
  • @Nate:大概它是一个静态成员函数,或者编译器会适合。由于不同的语言链接,根据 C++ 标准 IMO 在技术上是非法的,但实际上它应该可以工作(至少在 Windows 上)。
  • 我确实把它变成了静态的。感谢您的信息。

标签: linux windows macos c++11 sigabrt


【解决方案1】:

您描述的行为与记录中的一样。

来自Visual Studio documentation for abort(强调我的):

默认情况下,当使用调试运行时库构建应用程序时,中止例程会在引发 SIGABRT 之前显示错误消息。 [...] 要禁止显示消息,请使用 _set_abort_behavior 清除 _WRITE_ABORT_MSG 标志。

【讨论】:

  • 谢谢。我意识到,在我接受中止框后,它实际上在我的信号处理程序方法中达到了我的断点。我认为我的团队成员将覆盖中止,我们会将其作为常规异常处理,而不是处理 SIGABRT。
  • 如果您愿意,可以只使用 _set_abort_behavior。请注意,这只会影响调试版本。
  • 我们在调试和生产中都需要这个
猜你喜欢
  • 2019-01-27
  • 1970-01-01
  • 2021-06-17
  • 2012-11-20
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
相关资源
最近更新 更多