[英]Redirect c++ crash to stderr
考虑像这样的小程序:
int main()
{
freopen("./stdout.log", "w", stdout);
freopen("./stderr.log", "w", stderr);
int a = 1 / 0;
}
并且考虑到我的程序是由第三方软件运行的,我无法改变程序的启动方式和环境。
如何正确捕获除以零发出的Floating point exception (core dumped)
消息以及仍然打印在tty上的任何其他消息?
我试图搜索SO以获得类似的答案,但我可能只是键入错误的关键字,因为这似乎是一种常见的做法。
Matthieu Brucher的评论是正确的:
您需要捕获与平台相关的信号。
从消息文本中,我推断您可能正在Linux平台上运行。 如果是这样,您可以捕获SIGFPE
信号 。
#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编程接口书也有一个纯C示例 。
在Windows中,您可以使用结构化异常处理(SEH) ,概念类似(尽管您需要调用的函数不是)。
请注意,在任何一种情况下,您都依赖于C ++未指定的特定于平台的行为(除以零是未定义的行为),因此显然这不会导致可移植代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.