在PowerPC加载时使用LibUnwind引发C ++异常会设置随机浮点异常陷阱

问题描述

我目前正在调试PyTorch中的某些故障,该PyTorch是具有C ++扩展名的Python库,因此Python代码调用了一些C ++代码

发生故障是因为在看似纯真的std::exp调用导致核心转储之前,已设置了一些浮点异常陷阱。奇怪的是,仅通过feenableexcept设置FPE,然后使用相同的值调用std::exp不会导致崩溃/核心转储。因此,我不得不调试原始应用程序。

进行一些printf调试(在调试模式下编译时,代码当然不会中断[即未设置陷阱]),我将其范围缩小为throw c10::Error(...)语句。此类是从std::exception派生的,因此这里没有什么异常。要将C ++异常转换为Python异常,请输入catch(...){ /*set a bool*/; throw;}catch(c10::Error&){...}。到目前为止,没有什么看起来很奇怪,当然,这在最小的设置中也无法实现。

将gdb与catch throwcatch catch一起使用,我到达了引发并捕获此异常的地方,并做了一些单步操作(step),接着是p fegetexcept()和确实:

90  in ../../../../libstdc++-v3/libsupc++/eh_throw.cc
(gdb) p fegetexcept()
$20 = 0
(gdb) s
Catchpoint 4 (exception caught),__cxxabiv1::__cxa_begin_catch (exc_obj_in=0x11c6da60) at ../../../../libstdc++-v3/libsupc++/eh_catch.cc:42
42  ../../../../libstdc++-v3/libsupc++/eh_catch.cc: Datei oder Verzeichnis nicht gefunden.
(gdb) p fegetexcept()
$21 = 536870912

因此在FPE内,FPE仍未设置,而在扣子内。 eh_throw中的行是_Unwind_RaiseException (&header->exc.unwindHeader);,我无法进入。

每个程序调用fegetexcept()值也有很大不同。此外,如果我不使用GLOG进行构建,那么问题就消失了,我使用libunwind进一步跟踪了它。

但是,除了libunwind调用setcontext只能从那里进行汇编之外,我什么也做不到。在lfd fp29,(SIGCONTEXT_FP_REGS+(PT_R29*8))(r31)行,fegetexcept()的值改变。

所以这看起来像一个libunwind问题。但是,当我使用clang 9.0.1而不是GCC 8.3.0时,也不会出现此问题。所以我在这里茫然。

有人知道这个问题可能是什么,我还能做什么或是否存在已知错误?如果需要的话,将使用glibc 2.17和libunwind 1.4.0。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...