首页 > 解决方案 > 如何调试 atan2 中的段错误?

问题描述

我在有人发给我的大点云上运行 Wolkenbase ( https://github.com/phma/wolkenbase )。它崩溃了;我查看了核心文件,发现它在atan2中出现了segfaulted,这没有任何意义。我在附加 gdb 的情况下运行它,发现它确实在 atan2 中存在段错误。怀疑内存错误(释放后使用,或类似的东西),我在打开地址清理器的情况下编译它,发现它确实在释放后使用。我将此追溯到不拥有它获得的块的主线程,并修复了该错误。我重新编译它并再次运行它,附加调试器并在 __asan::ReportGenericError 中设置断点。它在没有触发断点的情况下发生了段错误。这是回溯:

#0  0x00007f0098680bc6 in __ieee754_atan2_fma (y=1, x=0)
    at ../sysdeps/ieee754/dbl-64/e_atan2.c:535
#1  0x00007f0098609c85 in __atan2 (y=16.168757937382907, x=-8.5716027432063129)
    at w_atan2_compat.c:39
#2  0x00000000004da5c1 in atan2i (y=16.168757937382907, x=-8.5716027432063129)
    at /home/phma/src/wolkenbase/angle.cpp:92
#3  0x00000000004da646 in atan2i (vect=...) at /home/phma/src/wolkenbase/angle.cpp:97
#4  0x000000000051e822 in dir (a=..., b=...) at /home/phma/src/wolkenbase/point.cpp:196
#5  0x00000000004e8558 in classifyCylinder (cylAddress=...)
    at /home/phma/src/wolkenbase/classify.cpp:139
#6  0x00000000005cffd3 in WolkenThread::operator() (this=0x602000126b78, thread=5)
    at /home/phma/src/wolkenbase/threads.cpp:625
#7  0x00000000005dcb76 in std::__invoke_impl<void, WolkenThread, int> (__f=..., 
    __args=@0x602000126b78: 5)
    at /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/invoke.h:60
#8  0x00000000005dca82 in std::__invoke<WolkenThread, int> (__fn=..., 
    __args=@0x602000126b78: 5)
    at /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/invoke.h:95
#9  0x00000000005dca45 in std::thread::_Invoker<std::tuple<WolkenThread, int> >::_M_invoke<0ul, 1ul> (this=0x602000126b78)
    at /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/thread:244
#10 0x00000000005dc9f5 in std::thread::_Invoker<std::tuple<WolkenThread, int> >::operator() (this=0x602000126b78)
    at /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/thread:251
#11 0x00000000005dc75e in std::thread::_State_impl<std::thread::_Invoker<std::tuple<WolkenThread, int> > >::_M_run (this=0x602000126b70)
    at /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/thread:195
#12 0x00007f009881dd84 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#13 0x00007f0099b00609 in start_thread (arg=<optimized out>) at pthread_create.c:477
#14 0x00007f00984fa293 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95

它从圆柱体的轴检查点的方向,寻找围绕轴的点。我拥有的唯一 e_atan2.c 副本位于从另一台计算机复制的 Julia 源代码中,这无关紧要。我还应该尝试什么来找到错误?

ETA:这是崩溃时的寄存器转储和反汇编,这次使用 gcc 编译:

(gdb) info registers
rax            0x37fffff90         15032385424
rbx            0x1fb7              8119
rcx            0x7f96a1003840      140284922968128
rdx            0x7ffffff0          2147483632
rsi            0x7ffffff0          2147483632
rdi            0x0                 0
rbp            0x0                 0x0
rsp            0x7f7a257f9770      0x7f7a257f9770
r8             0x40100000          1074790400
r9             0x7f7a040ee190      140162030821776
r10            0x1                 1
r11            0x1                 1
r12            0x7ffd25e55f7e      140725239242622
r13            0x7ffd25e55f7f      140725239242623
r14            0x7ffd25e55f80      140725239242624
r15            0x7f7a257f9f80      140162591858560
rip            0x7f7aa0f84bc6      0x7f7aa0f84bc6 <__ieee754_atan2_fma+7606>
eflags         0x10206             [ PF IF RF ]
cs             0x33                51
ss             0x2b                43
ds             0x0                 0
es             0x0                 0
fs             0x0                 0
gs             0x0                 0
(gdb) disas 0x7f7aa0f84b86,0x7f7aa0f84c06
Dump of assembler code from 0x7f7aa0f84b86 to 0x7f7aa0f84c06:
   0x00007f7aa0f84b86 <__ieee754_atan2_fma+7542>:       add    $0x0,%al
   0x00007f7aa0f84b88 <__ieee754_atan2_fma+7544>:       jmpq   0x7f7aa0f847fa <__ieee754_atan2_fma+6634>
   0x00007f7aa0f84b8d <__ieee754_atan2_fma+7549>:       vmovsd 0x2d75b(%rip),%xmm6        # 0x7f7aa0fb22f0
   0x00007f7aa0f84b95 <__ieee754_atan2_fma+7557>:       vmovapd %xmm5,%xmm1
   0x00007f7aa0f84b99 <__ieee754_atan2_fma+7561>:       vfmadd132sd 0x4149e(%rip),%xmm6,%xmm1        # 0x7f7aa0fc6040
   0x00007f7aa0f84ba2 <__ieee754_atan2_fma+7570>:       lea    0x7f017(%rip),%rcx        # 0x7f7aa1003bc0 <cij>
   0x00007f7aa0f84ba9 <__ieee754_atan2_fma+7577>:       vsubsd %xmm6,%xmm1,%xmm1
   0x00007f7aa0f84bad <__ieee754_atan2_fma+7581>:       vcvttsd2si %xmm1,%edx
   0x00007f7aa0f84bb1 <__ieee754_atan2_fma+7585>:       sub    $0x10,%edx
   0x00007f7aa0f84bb4 <__ieee754_atan2_fma+7588>:       movslq %edx,%rsi
   0x00007f7aa0f84bb7 <__ieee754_atan2_fma+7591>:       lea    0x0(,%rsi,8),%rax
   0x00007f7aa0f84bbf <__ieee754_atan2_fma+7599>:       sub    %rsi,%rax
   0x00007f7aa0f84bc2 <__ieee754_atan2_fma+7602>:       lea    (%rcx,%rax,8),%rcx
=> 0x00007f7aa0f84bc6 <__ieee754_atan2_fma+7606>:       vsubsd (%rcx),%xmm5,%xmm1
   0x00007f7aa0f84bca <__ieee754_atan2_fma+7610>:       vsubsd 0x8(%rcx),%xmm8,%xmm9
   0x00007f7aa0f84bcf <__ieee754_atan2_fma+7615>:       vaddsd %xmm3,%xmm1,%xmm6
   0x00007f7aa0f84bd3 <__ieee754_atan2_fma+7619>:       vmovsd 0x30(%rcx),%xmm1
   0x00007f7aa0f84bd8 <__ieee754_atan2_fma+7624>:       vfmadd213sd 0x28(%rcx),%xmm6,%xmm1
   0x00007f7aa0f84bde <__ieee754_atan2_fma+7630>:       vfmadd213sd 0x20(%rcx),%xmm6,%xmm1
   0x00007f7aa0f84be4 <__ieee754_atan2_fma+7636>:       vfmadd213sd 0x18(%rcx),%xmm6,%xmm1
   0x00007f7aa0f84bea <__ieee754_atan2_fma+7642>:       vfmadd213sd 0x10(%rcx),%xmm6,%xmm1
   0x00007f7aa0f84bf0 <__ieee754_atan2_fma+7648>:       vfnmadd213sd 0x824b7(%rip),%xmm6,%xmm1        # 0x7f7aa10070b0 <opi1>
   0x00007f7aa0f84bf9 <__ieee754_atan2_fma+7657>:       vmovsd 0x720bf(%rip),%xmm6        # 0x7f7aa0ff6cc0 <ua2>
   0x00007f7aa0f84c01 <__ieee754_atan2_fma+7665>:       cmp    $0x6f,%edx
   0x00007f7aa0f84c04 <__ieee754_atan2_fma+7668>:       jg     0x7f7aa0f84c0e <__ieee754_atan2_fma+7678>

标签: c++multithreadingdebuggingsegmentation-fault

解决方案


推荐阅读