问题描述
我目前正在调试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 throw
和catch 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 (将#修改为@)