Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 抛出一个C++;PowerPC上加载的LibUnwind异常设置随机浮点异常陷阱_C++_Powerpc_Floating Point Exceptions_Ppc64le - Fatal编程技术网

C++ 抛出一个C++;PowerPC上加载的LibUnwind异常设置随机浮点异常陷阱

C++ 抛出一个C++;PowerPC上加载的LibUnwind异常设置随机浮点异常陷阱,c++,powerpc,floating-point-exceptions,ppc64le,C++,Powerpc,Floating Point Exceptions,Ppc64le,我目前正在调试PyTorch中的一些失败,它是一个带有C++扩展的Python库,因此有一些由Python代码调用的C++代码。 发生故障的原因是,在看似无辜的std::exp调用导致内核转储之前设置了一些浮点异常陷阱。奇怪的是,将其降至最低,只需通过feenableexcept设置FPE,然后使用相同的值调用std::exp,就不会产生此崩溃/核心转储。所以我一直在调试原始应用程序 进行一些printf调试(当然,在调试模式下编译时代码不会中断[即未设置陷阱]),我将其缩小为一个throw c

我目前正在调试PyTorch中的一些失败,它是一个带有C++扩展的Python库,因此有一些由Python代码调用的C++代码。 发生故障的原因是,在看似无辜的std::exp调用导致内核转储之前设置了一些浮点异常陷阱。奇怪的是,将其降至最低,只需通过
feenableexcept
设置FPE,然后使用相同的值调用
std::exp
,就不会产生此崩溃/核心转储。所以我一直在调试原始应用程序

进行一些printf调试(当然,在调试模式下编译时代码不会中断[即未设置陷阱]),我将其缩小为一个
throw c10::Error(…)
语句。这个类是从
std::exception
派生的,所以这里没有什么异常。若要将C++异常转换为Python异常,则输入“代码> catch(…){ /*设置BoOL*/;抛出;} catch(C10::Error){}} /Cuth>。到目前为止还没有什么奇怪的,当然这也不会在一个最小的设置中重现

使用带有
catch-throw
catch-catch
的gdb,我到达了抛出并捕获此异常的位置,并执行了一些单步(
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\u throw
中的行是
\u Unwind\u RaiseException(&header->exc.unwindHeader)我无法进入

另外,
fegetexcept()
的值在每个程序调用中都有很大的不同。此外,如果我不使用GLOG构建,问题就会消失,我进一步使用libunwind对GLOG进行了跟踪

然而,我只能从libunwind调用
setcontext
来获取汇编。在一行
lfdfp29,(SIGCONTEXT\u FP\u REGS+(PT\u R29*8))(r31)
fegetexcept()的值改变

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

是否有人知道问题可能是什么,我还能做什么,或者是否存在已知的bug?这是使用glibc2.17和libunwind1.4.0来解决问题