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