根据 gdb 信息源找不到源文件

source file not found according to gdb info source

我正在调试一个 C 应用程序 运行 一个动态链接的共享库。该程序在 Ubuntu 14.04 64 位上运行良好。但是当 Linux 在退出应用程序时终止共享对象时,它会在 Ubuntu 16.04 上生成分段错误。

在 gdb 中,我在分段错误发生之前设置了一个断点。然后我用info source查看源文件信息:

Thread 1 "test" hit Breakpoint 3, _dl_fini () at dl-fini.c:201
(gdb) info source
Current source file is dl-fini.c
Compilation directory is /build/glibc-bfm8X4/glibc-2.23/elf
Located in /build/glibc-bfm8X4/glibc-2.23/elf/dl-fini.c
Source language is c.
Producer is GNU C11 5.4.0 20160609 -mno-mmx -mtune=generic -march=x86-64 -g -O2 -O3 -std=gnu11 -fgnu89-inline -fno-stack-protector -fmerge-all-constants -frounding-math -fPIC -ftls-model=initial-exec.
Compiled with DWARF 2 debugging format.
Does not include preprocessor macro info.

我找不到指示的编译目录和源文件的位置。

目录/build/glibc-bfm8X4/glibc-2.23/elf 不存在。有人知道这种情况吗?

这是机器上编译 glibc 的目录。它在我们的机器上不存在。

安装相关包的 -dbg 版本(使用 sudo apt-get install)- 安装调试符号。获取库的源代码(通过使用 apt-get source)- 获取下载到当前目录的实际源文件。

glibcsudo apt-get install libc6-dbgapt-get source libc6

有用的命令:

  • 列出所有包:dpkg -l(然后可以在列表中grep获取具体的包名)
  • 列出包中的文件:dpkg -L <package name>
  • 搜索文件所属的包:dpkg -S <file path>

使用 ~/.gdbinit 中的 directory <path to source dir> 声明将 gdb 指向带有源代码的正确目录。

此外,尝试 valgrindrr 实用程序。