将C ++崩溃重定向到stderr

时间:2018-11-09 15:12:30

标签: c++

考虑一个像这样的小程序:

int main()
{
    freopen("./stdout.log", "w", stdout);
    freopen("./stderr.log", "w", stderr);

    int a = 1 / 0;
}

考虑到我的程序是由第三方软件运行的,因此我既不能更改程序的启动方式,也不能更改环境。

如何正确捕获除以零的Floating point exception (core dumped)消息以及仍将打印在tty上的任何其他消息?

我试图在SO中搜索类似的答案,但由于这似乎很常见,我可能只是键入了错误的关键字。

1 个答案:

答案 0 :(得分:2)

Matthieu Brucher的评论是正确的:

  

您需要捕获信号,这取决于平台。

从消息文本中,我推断您可能正在Linux平台上运行。如果是这样,您可以catch the SIGFPE signal

#include <stdexcept>
#include <signal.h>

// compile with -fnon-call-exceptions (for gcc)
signal(SIGFPE, [](int signum) { throw std::logic_error("FPE"); });

链接的答案具有C ++的一些优点,例如使用std::shared_ptr进行信号处理器的RAII管理,并提及gcc使其工作所需的编译器标志。

Linux编程接口书也有一个pure-C example


在Windows中,您可以使用Structured Exception Handling (SEH),并且概念类似(尽管不需要调用的功能)。


请注意,无论哪种情况,您都依赖于C ++未指定的特定于平台的行为(零除是未定义的行为),因此显然这不会导致可移植代码。