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

7

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

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

5个回答

8
如果您的C++标准库实现支持TR1函数fetestexceptferaiseexceptfeclearexcept(我的还没有,所以我无法测试),则可以检测五种浮点错误,然后您可以抛出任何异常。
有关这些函数的描述,请参见此处
此外,我还推荐Pete Becker的书《The C++ Standard Library Extensions: A Tutorial and Reference》第12.3节“管理浮点环境”,ISBN-13:9780321412997,其中包含这些函数的优秀描述和示例代码。

alt text


3
由于信号和异常的工作方式,当信号被抛出时无法立即执行 - 异常依赖于在调用信号处理程序时不成立的堆栈某些方面。
您可以在信号处理程序中设置一个全局变量,然后在程序的关键点检查它,并在其已设置时抛出异常。但这并不能提供有关所抛出异常的确切信息。

你可以使用backtrace_symbols在信号处理程序中计算和存储堆栈跟踪,这至少能给你一个完整的堆栈跟踪。 - Geoffrey Irving

3

gcc选项-fnon-call-exceptions可能对您有所帮助。尽管我没有找到任何关于它的文档,但您可以试试看。


1

我没有现成的解决方案,但你可以看看signals(不确定是否安全从中抛出C++异常,但在调试中应该有所帮助)。

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


0
基本思路是为您安装适当的浮点异常信号处理程序。在信号处理程序内部,您可以抛出异常(或向另一个进程发送用户定义的信号以引发异常,或向另一个线程发送消息以进行类似操作等等)。实际上抛出异常的方法有很多种 - 主要是要处理信号。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接