1

我目前正在调试 PyTorch 中的一些故障,这是一个带有 C++ 扩展的 Python 库,因此 Python 代码调用了一些 C++ 代码。

std::exp发生故障是因为在看似无辜的调用导致核心转储之前设置了一些浮点异常陷阱。奇怪的是,将其减少到最低限度,只需设置 FPE viafeenableexcept然后std::exp使用相同的值调用不会产生此崩溃/核心转储。所以我坚持调试原始应用程序。

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

将 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 仍未设置,而在接球的内部。里面的线eh_throw_Unwind_RaiseException (&header->exc.unwindHeader);我无法进入的。

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

setcontext但是,我只能从我只得到汇编的 libunwind 调用中得到任何进一步的信息。一行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 以防万一。

4

0 回答 0