【问题标题】:Converting floating point exceptions into C++ exceptions将浮点异常转换为 C++ 异常
【发布时间】:2010-09-10 06:53:30
【问题描述】:

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

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

【问题讨论】:

    标签: c++ exception floating-point signals


    【解决方案1】:

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

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

    我还推荐 Pete Becker 所著的C++ 标准库扩展:教程和参考一书的第 12.3 节“管理浮点环境”,ISBN-13: 9780321412997用示例代码描述这些函数。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 您可以使用 backtrace_symbols 计算堆栈跟踪并将其存储在信号处理程序中,这至少可以为您提供完整的堆栈跟踪。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2019-07-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-07-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多