我正在调试使用动态链接的共享库运行的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不存在。有谁知道这种情况?
提前致谢。
答案 0 :(得分:4)
这是编译glibc
的机器上的目录。它并不存在于我们的机器上。
安装所涉及软件包的-dbg
版本(使用sudo apt-get install
) - 以安装调试符号。获取库的源代码(使用apt-get source
) - 获取下载到当前目录中的实际源文件。
glibc
sudo apt-get install libc6-dbg
和apt-get source libc6
有用的命令:
dpkg -l
(然后可以在特定包名列表中grep
)dpkg -L <package name>
dpkg -S <file path>
使用directory <path to source dir>
中的~/.gdbinit
声明将gdb指向包含源代码的正确目录。
另外,请尝试valgrind
和rr
实用程序。