【发布时间】:2010-09-10 06:53:30
【问题描述】:
是否可以在 x86 Linux 上将浮点异常(信号)转换为 C++ 异常?
这是出于调试目的,因此不可移植性和缺陷是可以的(例如,如果不能 100% 保证调用所有析构函数)。
【问题讨论】:
标签: c++ exception floating-point signals
是否可以在 x86 Linux 上将浮点异常(信号)转换为 C++ 异常?
这是出于调试目的,因此不可移植性和缺陷是可以的(例如,如果不能 100% 保证调用所有析构函数)。
【问题讨论】:
标签: c++ exception floating-point signals
如果您的 C++ 标准库实现支持 TR1 函数
fetestexcept、feraiseexcept 和 feclearexcept(我的还没有,所以我无法测试)你可以检测五种浮点错误,然后你可以抛出任何你想要的异常。
有关这些功能的说明,请参阅here。
我还推荐 Pete Becker 所著的C++ 标准库扩展:教程和参考一书的第 12.3 节“管理浮点环境”,ISBN-13: 9780321412997用示例代码描述这些函数。
【讨论】:
由于信号和异常的工作方式,当信号被抛出时,您不能立即执行此操作 - 异常依赖于堆栈的某些方面,而在调用信号处理程序时,这些方面是不正确的。
您可以在信号处理程序中设置一个全局变量,然后在程序中的关键点进行检查,如果设置了则抛出异常。但是,这并没有为您提供有关引发异常的确切信息。
【讨论】:
gcc 选项 -fnon-call-exceptions 可能对您有用。虽然找不到任何文档,所以您的里程可能会有所不同。
【讨论】:
我没有现成的解决方案,但您可以查看 signals(不确定您是否可以安全地从它们那里抛出 C++ 异常,但无论如何它应该有助于调试。)
您可以为 SIGFPE 安装信号处理程序,并将其用于调试目的。
【讨论】:
基本思想是为您安装适当的信号处理程序以处理浮点异常。在您的信号处理程序中,您可以抛出异常(或将用户定义的信号发送到将引发异常的另一个进程,或将消息发送到另一个线程以获得类似的东西,等等等等)。有很多方法可以实际抛出异常 - 主要是处理信号。
【讨论】: