c++ - 如何调试 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>
解决方案
推荐阅读
- javascript - Vanilla 等价于 wrapInner() 用于在 li 中放置标签(无序列表)
- r - R:如何按最近的单个时间日期连接两个数据表?
- html - 表格行的高度不变
- linux - 如何查找 .desktop 文件的所有属性(名称、图标等)?
- javascript - 使用主页中的 JavaScript 在一个页面中包含多个 html 页面
- arrays - React 无法从数组中读取对象的属性
- c# - 无法将源代码文件添加到 Windows 窗体应用程序?
- amazon-web-services - 有没有办法用来自特定用户的推文触发 AWS lambda 函数
- javascript - 从数组中随机显示文本的翻转卡片
- c++ - 如何正确使用 Constructor-Function-Try-Block?