gpt4 book ai didi

c++ - 将 C++ 崩溃重定向到 stderr

转载 作者:太空狗 更新时间:2023-10-29 21:32:58 27 4
gpt4 key购买 nike

考虑这样一个小程序:

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

int a = 1 / 0;
}

考虑到我的程序是由第三方软件运行的,我无法更改程序的启动方式和环境。

如何正确捕获由除零发出的浮点异常(核心转储)消息以及仍将打印在 tty 上的任何其他消息?

我已经尝试搜索类似的答案,但我可能只是输入了错误的关键字,因为这似乎是一种常见的做法。

最佳答案

Matthieu Brucher 的评论是正确的:

You need to catch the signals, which is platform dependent.

从消息的内容来看,我推测您可能运行在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 Programming Interface 书也有 pure-C example .


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


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

关于c++ - 将 C++ 崩溃重定向到 stderr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53228369/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com