c++ - GDB 在核心文件上使用 "symbol-file"命令读取符号

标签 c++ gdb core-file

我正在尝试分析 Linux 核心文件上的段错误。我不确定以下行为是否正确,因此我故意使用

造成段错误
#include <signal.h>
int main() {
raise(SIGSEGV); 
}

二进制文件是用调试信息构建的,即

file mainTestFile 
mainTestFile: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0, with debug_info, not stripped

注意它最后是如何说“with debug_info, not stripped”

当我执行二进制文件时,我生成了一个名为 core-mainTestFile.20474 的核心文件 (为了生成核心文件,我不得不将我的 ulimit 设置为无限制,即 ulimit -c 无限制 )

如果我只在 GDB 下运行二进制文件并执行回溯“bt”,那么我会得到段错误,并且我会得到所有涉及的函数的名称 打印得很好,即注意 gdb 在开始“从 ./mainTestFile 中读取符号...完成时”是如何说的。

gdb ./mainTestFile
GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git

....

reading symbols from ./mainTestFile...done.
(gdb) run
Starting program: /src/exe/mainTestFile 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".


Program received signal SIGSEGV, Segmentation fault.
__GI_raise (sig=<optimized out>) at ../sysdeps/unix/sysv/linux/raise.c:51
51      ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0  __GI_raise (sig=<optimized out>) at ../sysdeps/unix/sysv/linux/raise.c:51
#1  0x0000000000402dad in main (argc=1, argv=0x7fffffffda38) at /src/exe/main.cpp:53
(gdb) 

但是,如果我尝试像这样使用 gdb 仅分析核心文件

gdb -c core-mainTestFile.20474

然后我只得到问号

当我执行“bt”时,我没有看到方法的名称,而是看到了问号

(gdb) bt
#0  0x00007f34d8842e97 in ?? ()
#1  0x0000000000000000 in ?? ()

我发现他们唯一的解决方法是直接在命令行提供二进制文件,然后它就会被很好地打印出来。 即使我试图告诉 GDB 使用符号文件并将其指向包含符号的二进制文件 即

symbol-file /src/exe/mainTestFile

然后 GDB 说

Reading symbols from /src/exe/mainTestFile...done

当我执行 bt 时,我又看到问号了吗?这是为什么。 GDB 不能从二进制文件中取出符号吗?

它只有在直接在命令上提供二进制文件时才有效,例如:

gdb /src/exe/mainTestFile -c core-mainTestFile.20474

我的问题是,当通过“symbol-file”命令直接向他提供二进制文件时,GDB 是否应该能够读取二进制文件的符号。为什么在通过命令行直接向他提供二进制文件时这会起作用,有什么区别?

最佳答案

should the GDB be able to read symbols of the binary when directly supplying him the binary over the "symbol-file" command or not.

理论上,在 GDB 中以 任一个 顺序使用 symbol-filecore-file 命令应该是等效的。

但是有一个错误:symbol-file 后接 core-file 有效,相反的顺序无效。

因为通常最终用户总是可以将他的命令重新排列成有效的顺序,所以这从来没有传播到任何 GDB 开发人员要修复的问题队列的顶部。

相关bug (但不是完全相同的拷贝)。

关于c++ - GDB 在核心文件上使用 "symbol-file"命令读取符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57239664/

相关文章:

gdb - 为什么gdb在调试MPI程序时来回走动?

gdb - 无法使用 Ctrl-X A 退出 tui 模式,也无法在 tui 模式下查看程序输出

c++ - DDD 调试器 : save A command history between sessions

c++ - 调试已发布软件的 C++ 核心文件

c++ - .bss 部分零初始化变量是否占用 elf 文件中的空间?

c++ - 使用序列化 C++ 保存游戏状态

c++ - 带有发布和调试版本的简单 makefile - 最佳实践

c++ - 没有 mpi 指令的程序在 mpirun 中非常慢