将浮点异常转换为 C++ 异常

Converting floating point exceptions into C++ exceptions

提问人:Geoffrey Irving 提问时间:9/18/2008 更新时间:1/1/2019 访问量:3307

问:

是否可以在 x86 Linux 上将浮点异常(信号)转换为 C++ 异常?

这是出于调试目的,因此不可移植性和不完美性是可以的(例如,如果不能 100% 保证调用所有析构函数)。

C++ 异常 浮点 信号

评论


答:

3赞 Branan 9/18/2008 #1

由于信号和异常的工作方式,您不能在抛出信号时立即执行此操作 - 异常依赖于堆栈的某些方面,而这些方面在调用信号处理程序时并不真实。

您可以在信号处理程序中设置一个全局变量,然后在程序的关键点检查它,如果设置了,则抛出异常。但是,这不会为您提供有关引发的异常的确切信息。

评论

0赞 Geoffrey Irving 9/18/2008
您可以使用 backtrace_symbols 在信号处理程序中计算堆栈跟踪并将其存储,这至少为您提供了完整的堆栈跟踪。
1赞 Tobi 9/18/2008 #2

我没有现成的解决方案,但您可以查看的一件事是信号(不确定是否可以安全地从中抛出 C++ 异常,但无论如何它应该有助于调试。

您可以为 SIGFPE 安装信号处理程序,并将其用于调试目的。

0赞 Ben Collins 9/18/2008 #3

基本思想是针对浮点异常安装适当的信号处理程序。在信号处理程序中,您可以抛出异常(或将用户定义的信号发送到另一个将引发异常的进程,或向另一个线程发送消息以获取类似内容,等等)。有很多方法可以实际抛出异常 - 主要是处理信号。

3赞 user12310 9/18/2008 #4

gcc 选项 -fnon-call-exceptions 可能对您有用。虽然找不到任何关于它的文档,所以你的里程可能会有所不同。

8赞 jwfearn 9/18/2008 #5

如果您的 C++ 标准库实现支持 TR1 函数,并且(我的还没有,所以我无法测试这一点)您可以检测到五种浮点错误,然后您可以抛出任何您想要的异常。fetestexceptferaiseexceptfeclearexcept

有关这些功能的说明,请参阅此处

我还推荐 Pete Becker 所著的《The C++ Standard Library Extensions: A Tutorial and Reference, ISBN-13: 9780321412997》一书的第 12.3 节“管理浮点环境”,以通过示例代码对这些函数进行出色的描述。

alt text