2008-09-17 95 views
7

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

这是为了调试的目的,所以不可移植性和缺陷是可以的(例如,如果它不是100%保证所有析构函数被调用)。

回答

3

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

您可以在信号处理程序中设置一个全局变量,然后在程序中的关键点检查它并在设置时抛出异常。尽管如此,这并不能提供有关抛出异常的确切信息。

+0

你可以计算和使用backtrace_symbols,这至少给你一个完整的堆栈跟踪存储信号处理程序的堆栈跟踪。 – 2008-09-17 19:58:50

1

我没有一个现成的解决方案,但有一点你可以看看是signals(不知道您是否可以安全地从他们抛出C++异常,但它应该帮助反正调试。)

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

0

基本想法是为你安装适当的信号处理程序来处理浮点异常。在你的信号处理程序中,你可以抛出一个异常(或者发送一个用户定义的信号给另一个进程,这个进程会引发异常,或者向另一个线程发送消息,用于类似的东西等等)。有许多方法可以实际抛出异常 - 主要是处理信号。

3

gcc选项-fnon-call-exceptions可能对您有些用处。尽管如此,您的里程可能会有所不同,但找不到任何文件。

8

如果你的C++标准库实现支持TR1功能 fetestexceptferaiseexceptfeclearexcept(我还没有,所以我不能对此进行测试),你可以检测5种浮点错误的,然后你可以抛出任何异常你要。

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

我还建议第12.3节,“管理浮点环境”一书的C++标准库扩展:教程和参考皮特·贝克尔,ISBN-13:9780321412997,对于这些功能的精彩描述带有示例代码。

alt text http://ak.buy.com/db_assets/prod_images/225/202452225.jpg