C++ GDB读取带有“的符号”;符号文件";核心文件上的命令
我试图在linux上分析一个核心文件上的segfault。我不确定以下行为是否正确,因此我故意使用C++ GDB读取带有“的符号”;符号文件";核心文件上的命令,c++,gdb,core-file,C++,Gdb,Core File,我试图在linux上分析一个核心文件上的segfault。我不确定以下行为是否正确,因此我故意使用 #include <signal.h> int main() { raise(SIGSEGV); } 注意它在结尾是如何说“带有调试信息,而不是剥离的” 当我执行二进制文件时,生成了一个核心文件,名为core-mainTestFile.20474 (为了生成核心文件,我需要将ulimit设置为unlimit,即。 ulimit-c无限 ) 如果我只在GDB下运行二进制文件并执行回溯
#include <signal.h>
int main() {
raise(SIGSEGV);
}
注意它在结尾是如何说“带有调试信息,而不是剥离的”
当我执行二进制文件时,生成了一个核心文件,名为core-mainTestFile.20474
(为了生成核心文件,我需要将ulimit设置为unlimit,即。
ulimit-c无限
)
如果我只在GDB下运行二进制文件并执行回溯“bt”,那么我将获得segfault,并获得所有相关函数的名称
打印得很好,即注意gdb在开始“从./mainTestFile读取符号…完成”时是如何表示的
那我就只有问号了
(gdb) bt
#0 0x00007f34d8842e97 in ?? ()
#1 0x0000000000000000 in ?? ()
当我执行“bt”时,我看不到方法的名称,而是得到问号
(gdb) bt
#0 0x00007f34d8842e97 in ?? ()
#1 0x0000000000000000 in ?? ()
我发现他们唯一的解决办法是直接在命令行提供二进制文件,然后很好地打印出来。
即使我试图告诉GDB使用符号文件,并将其指向具有符号的二进制文件
i、 e
然后GDB说
Reading symbols from /src/exe/mainTestFile...done
当我执行bt时,我又看到了问号?这是为什么。GDB不能从二进制文件中提取符号吗
仅当直接在命令上提供二进制文件时,它才起作用,如:
gdb /src/exe/mainTestFile -c core-mainTestFile.20474
我的问题是GDB在通过“symbol file”命令直接向他提供二进制文件时是否能够读取二进制文件的符号。当通过命令行直接向他提供二进制文件时,为什么会起作用,有什么区别
当通过“symbol file”命令直接向GDB提供二进制文件时,GDB是否能够读取二进制文件的符号
理论上,在GDB中以任意顺序使用符号文件
和核心文件
命令应该是等效的
但是有一个bug:符号文件
后跟核心文件
有效,相反的顺序无效
由于最终用户通常可以按照工作顺序重新排列其命令,因此这从未传播到任何GDB开发人员要修复的事情队列的顶部
相关的(但不是完全相同的)
symbol-file /src/exe/mainTestFile
Reading symbols from /src/exe/mainTestFile...done
gdb /src/exe/mainTestFile -c core-mainTestFile.20474