Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.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++ GDB调试特定调用堆栈缺少符号表的coredump_C++_Linux_Gdb_Coredump - Fatal编程技术网

C++ GDB调试特定调用堆栈缺少符号表的coredump

C++ GDB调试特定调用堆栈缺少符号表的coredump,c++,linux,gdb,coredump,C++,Linux,Gdb,Coredump,我遇到了这个奇怪的崩溃,我不知道如何调试核心转储,因为调用堆栈由于某种原因缺少符号信息,除了最后一个函数: #0 BIH::intersectRay<VMAP::MapRayCallback> (this=0x7f47b8339608, r=..., intersectCallback=..., maxDist=@0x7f493af8383c: 0, stopAtFirst=true, los=<optimized out>) at ../BIH.h:223 #1 0

我遇到了这个奇怪的崩溃,我不知道如何调试核心转储,因为调用堆栈由于某种原因缺少符号信息,除了最后一个函数:

#0  BIH::intersectRay<VMAP::MapRayCallback> (this=0x7f47b8339608, r=..., intersectCallback=..., maxDist=@0x7f493af8383c: 0, stopAtFirst=true, los=<optimized out>) at ../BIH.h:223
#1  0x000000307ff00000 in ?? ()
#2  0x7ff0000000000000 in ?? ()
#3  0x0000000000000030 in ?? ()
#4  0x000000307ff00000 in ?? ()
#5  0x7ff0000000000000 in ?? ()
#6  0x0000000000000030 in ?? ()
#7  0x000000307ff00000 in ?? ()
#8  0x7ff0000000000000 in ?? ()
#9  0x0000000000000030 in ?? ()
#10 0x000000307ff00000 in ?? ()
#11 0x7ff0000000000000 in ?? ()
#12 0x0000000000000030 in ?? ()
#13 0x000000307ff00000 in ?? ()
#14 0x7ff0000000000000 in ?? ()
#15 0x0000000000000030 in ?? ()
#16 0x000000307ff00000 in ?? ()
#17 0x7ff0000000000000 in ?? ()
#18 0x0000000000000030 in ?? ()
#19 0x000000307ff00000 in ?? ()
#20 0x7ff0000000000000 in ?? ()
#21 0x0000000000000030 in ?? ()
#22 0x000000307ff00000 in ?? ()
....
#749 0x7ff0000000000000 in ?? ()
#750 0x0000000000000030 in ?? ()
#751 0x000000307ff00000 in ?? ()
#752 0x7ff0000000000000 in ?? ()
#753 0x0000000000000030 in ?? ()
#754 0x000000307ff00000 in ?? ()
#755 0x7ff0000000000000 in ?? ()
#756 0x0000000000000030 in ?? ()
#757 0x000000307ff00000 in ?? ()
#758 0x7ff0000000000000 in ?? ()
#759 0x0000000000000030 in ?? ()
#760 0x000000307ff00000 in ?? ()
#761 0x7ff0000000000000 in ?? ()
#762 0x0000000000000030 in ?? ()
#763 0x000000307ff00000 in ?? ()
#764 0x03010102464c457f in ?? ()
#765 0x0000000000000000 in ?? ()`


(gdb) info frame 0
Stack frame at 0x7f493af83830:
 rip = 0x930f0b in BIH::intersectRay<VMAP::MapRayCallback> (../BIH.h:223); saved rip = 0x307ff00000
 called by frame at 0x7f493af83838
 source language c++.
 Arglist at 0x7f493af83438, args: this=0x7f47b8339608, r=..., intersectCallback=..., maxDist=@0x7f493af8383c: 0, stopAtFirst=true, los=<optimized out>
 Locals at 0x7f493af83438, Previous frame's sp is 0x7f493af83830
 Saved registers:
  rbx at 0x7f493af837f8, rbp at 0x7f493af83800, r12 at 0x7f493af83808, r13 at 0x7f493af83810, r14 at 0x7f493af83818, r15 at 0x7f493af83820, rip at 0x7f493af83828

#1  0x000000307ff00000 in ?? ()
No symbol table info available.
(gdb) info frame 1
Stack frame at 0x7f493af83838:
 rip = 0x307ff00000; saved rip = 0x7ff0000000000000
 called by frame at 0x7f493af83840, caller of frame at 0x7f493af83830
 Arglist at 0x7f493af83828, args:
 Locals at 0x7f493af83828, Previous frame's sp is 0x7f493af83838
 Saved registers:
  rip at 0x7f493af83830

#2  0x7ff0000000000000 in ?? ()
No symbol table info available.
(gdb) info frame 2
Stack frame at 0x7f493af83840:
 rip = 0x7ff0000000000000; saved rip = 0x30
 called by frame at 0x7f493af83848, caller of frame at 0x7f493af83838
 Arglist at 0x7f493af83830, args:
 Locals at 0x7f493af83830, Previous frame's sp is 0x7f493af83840
 Saved registers:
  rip at 0x7f493af83838

#3  0x0000000000000030 in ?? ()
No symbol table info available.
(gdb) info frame 3
Stack frame at 0x7f493af83848:
 rip = 0x30; saved rip = 0x307ff00000
 called by frame at 0x7f493af83850, caller of frame at 0x7f493af83840
 Arglist at 0x7f493af83838, args:
 Locals at 0x7f493af83838, Previous frame's sp is 0x7f493af83848
 Saved registers:
  rip at 0x7f493af83840

#4  0x000000307ff00000 in ?? ()
No symbol table info available.
(gdb) info frame 4
Stack frame at 0x7f493af83850:
 rip = 0x307ff00000; saved rip = 0x7ff0000000000000
 called by frame at 0x7f493af83858, caller of frame at 0x7f493af83848
 Arglist at 0x7f493af83840, args:
 Locals at 0x7f493af83840, Previous frame's sp is 0x7f493af83850
 Saved registers:
  rip at 0x7f493af83848
#0波黑::intersectRay(this=0x7f47b8339608,r=…,intersectCallback=…,maxDist=@0x7f493af8383c:0,stopAtFirst=true,los=)位于../波黑:223
#1 0x000000307ff00000英寸??()
#2 0x7ff0000000000000英寸??()
#3 0x0000000000000030英寸??()
#4 0x000000307ff00000英寸??()
#5 0x7ff0000000000000英寸??()
#6 0x0000000000000030英寸??()
#7 0x000000307ff00000英寸??()
#8 0x7ff0000000000000英寸??()
#9 0x0000000000000030英寸??()
#10 0x000000307ff00000英寸??()
#11 0x7ff0000000000000英寸??()
#12 0x0000000000000030英寸??()
#13 0x000000307ff00000英寸??()
#14 0x7ff0000000000000英寸??()
#15 0x0000000000000030英寸??()
#16 0x000000307ff00000英寸??()
#17 0x7ff0000000000000英寸??()
#18 0x0000000000000030英寸??()
#19 0x000000307ff00000英寸??()
#20 0x7ff0000000000000英寸??()
#21 0x0000000000000030英寸??()
#22 0x000000307ff00000英寸??()
....
#749 0x7ff0000000000000英寸??()
#750 0x0000000000000030英寸??()
#751 0x000000307ff00000英寸??()
#752 0x7ff0000000000000英寸??()
#753 0x0000000000000030英寸??()
#754 0x000000307ff00000英寸??()
#755 0x7ff0000000000000英寸??()
#756 0x0000000000000030英寸??()
#757 0x000000307ff00000英寸??()
#758 0x7ff0000000000000英寸??()
#759 0x0000000000000030英寸??()
#760 0x000000307ff00000英寸??()
#761 0x7ff0000000000000英寸??()
#762 0x0000000000000030英寸??()
#763 0x000000307ff00000英寸??()
#764 0x03010102464c457f英寸??()
#765 0x0000000000000000英寸??()`
(gdb)信息帧0
0x7f493af83830处的堆栈帧:
BIH中的rip=0x930f0b::intersectRay(../BIH.h:223);保存的rip=0x307ff00000
由0x7F493AF838处的帧调用
源语言C++。
0x7f493af83438处的Arglist,args:this=0x7f47b8339608,r=…,intersectCallback=…,maxDist=@0x7f493af8383c:0,stopAtFirst=true,服务水平=
局部变量位于0x7f493af83438,上一帧的sp为0x7f493af83830
保存的寄存器:
0x7f493af837f8处的rbx、0x7f493af83800处的rbp、0x7f493af83808处的r12、0x7f493af83810处的r13、0x7f493af83818处的r14、0x7f493af83820处的r15、0x7f493af83828处的rip
#1 0x000000307ff00000英寸??()
没有可用的符号表信息。
(gdb)信息帧1
0x7f493af83838处的堆栈帧:
rip=0x307ff00000;已保存的rip=0x7ff0000000000000
由0x7f493af83840处的帧调用,0x7f493af83830处的帧调用方
位于0x7f493af83828的参数列表,参数:
局部变量位于0x7f493af83828,上一帧的sp为0x7f493af83838
保存的寄存器:
在0x7f493af83830处撕裂
#2 0x7ff0000000000000英寸??()
没有可用的符号表信息。
(gdb)信息帧2
0x7f493af83840处的堆栈帧:
rip=0x7ff0000000000000;保存的rip=0x30
由0x7f493af83848处的帧调用,0x7F493AF838处的帧调用方
位于0x7f493af83830的Arglist,args:
在0x7f493af83830处,上一帧的sp为0x7f493af83840
保存的寄存器:
在0x7f493af83838处撕裂
#3 0x0000000000000030英寸??()
没有可用的符号表信息。
(gdb)信息帧3
0x7f493af83848处的堆栈帧:
rip=0x30;保存的rip=0x307ff00000
由0x7f493af83850处的帧调用,0x7f493af83840处的帧调用方
位于0x7f493af83838的参数列表,参数:
局部变量位于0x7f493af83838,上一帧的sp为0x7f493af83848
保存的寄存器:
在0x7f493af83840处撕裂
#4 0x000000307ff00000英寸??()
没有可用的符号表信息。
(gdb)信息帧4
0x7f493af83850处的堆栈帧:
rip=0x307ff00000;已保存的rip=0x7ff0000000000000
由0x7f493af83858处的帧调用,0x7f493af83848处的帧调用方
0x7f493af83840处的Arglist,args:
在0x7f493af83840处,上一帧的sp为0x7f493af83850
保存的寄存器:
在0x7f493af83848处撕裂
代码是用
-g-fvar tracking-O2-march=native
编译的

我有各种各样的崩溃转储,所有这些都有符号表工作,并给出了相关的调用堆栈和信息,但由于某种原因,这个特定的崩溃是神秘的

我注意到的一件事是,相同的地址号一次又一次地重复,可能是某种无限循环或某种递归导致堆栈损坏或溢出吗?
如果是这样的话,有没有办法获取调用堆栈中最顶层的函数(例如,有没有办法超过第#765帧或在触发溢出之前获取调用的函数)

我无法将
$sp
跳转到任何地址,因为我无法调试和单步执行实时程序,只需分析内核转储。
我无法复制这次崩溃,它不时发生在生产上。此外,valgrind是不可能的

是否有任何
g++
编译器选项或
gdb
标志可以帮助我解决这个问题?
任何关于如何调试这样一个问题的建议都是值得赞赏的(如果可能的话)

我不知道如何调试核心转储,因为调用堆栈由于某种原因缺少符号信息

第1部分:

这种无意义的调用堆栈最常见的原因是产生核心转储的二进制文件与用于实际分析核心的二进制文件之间不匹配

如果在链接时使用了
--build id
,或者如果默认情况下GCC配置为使用该链接器标志,则可以使用以下过程验证二进制文件是否与
核心文件匹配(或不匹配):

readelf -n /path/to/binary
这将产生类似于以下内容的输出:

$ readelf -n /bin/sleep

Displaying notes found at file offset 0x00000254 with length 0x00000020:
  Owner                 Data size   Description
  GNU                  0x00000010   NT_GNU_ABI_TAG (ABI version tag)
    OS: Linux, ABI: 2.6.24

Displaying notes found at file offset 0x00000274 with length 0x00000024:
  Owner                 Data size   Description
  GNU                  0x00000014   NT_GNU_BUILD_ID (unique build ID bitstring)
    Build ID: c266a51e4b85b16ca17bff8328f3abeafb577b29
构建id字符串c266a51e4b85b16ca17bff8328f3abeafb577b29
是您关心的输出。假设您的二进制文件拥有它,请安装
elfutils
包,然后使用

eu-unstrip -n --core /path/to/core
查看在生成核心转储时使用了哪些二进制文件

输出应如下所示:

$ eu-unstrip -n --core /tmp/core
0x400000+0x208000 c266a51e4b85b16ca17bff8328f3abeafb577b29@0x400284 - - [exe]
0x7ffca5721000+0x1000 9c7cbcf6c957d8fc8e55b45a3c7a1556b38a3097@0x7ffca5721340 . - linux-vdso.so.1
0x7f491ad5a000+0x2241c8 d0f537904076d73f29e4a37341f8a449e2ef6cd0@0x7f491ad5a1d8 /lib64/ld-linux-x86-64.so.2 /usr/lib/debug/lib/x86_64-linux-gnu/ld-2.19.so ld-linux-x86-64.so.2
0x7f491a995000+0x3c42c0 cf699a15caae64f50311fc4655b86dc39a479789@0x7f491a995280 /lib/x86_64-linux-gnu/libc.so.6 /usr/lib/debug/lib/x86_64-linux-gnu/libc-2.19.so libc.so.6
上面您可以看到,这个
核心
转储实际上是由
/bin/sleep
生成的

如果
core
中的可执行内部版本id与二进制文件不匹配,则需要找到内部版本id与
c匹配的二进制文件