GDB步入动态链接器(ld.so)代码

3

我希望可以在我的普通c代码中使用ld.so的代码。

我正在尝试在TUI模式下通过GDB进行代码流程分析,这个模式可以在跨越代码时同时看到源代码和汇编代码。

为此,我还从Ubuntu包管理器中安装了libc-dbgbinutils-source软件包。

GDB可以找到ld.so本身的调试符号,并且我可以使用si在指令级别上单步执行,但是由于GDB无法找到ld.so的源代码,因此我无法在源代码级别上单步执行并显示"NO Source Available"。

我应该如何让GDB找到ld.so的源代码,以便我还可以看到正在实际执行的ld.so源代码行。

我使用的是Ubuntu 12.10 64位GCC 4.8.2

2个回答

4
如果您有libc的源代码可用,您可以使用dir命令将源添加到gdb的源路径中:Source_Path 编辑:要调试与libc相关的文件(在Ubuntu发行版中),您需要:
  1. 通过安装libc6-dbg包获取libc的调试信息。
  2. 通过启用源代码存储库(通过运行software-sources并勾选“启用源代码存储库”)并运行apt-get source libc6来获取libc的源代码。
  3. 将libc的调试信息添加到LD_LIBRARY_PATH中:export LD_LIBRARY_PATH=/usr/lib/debugLD_LIBRARY_PATH=/usr/lib/debug gdb <application>
  4. 将c文件的完整路径添加到gdb的源路径中,即:dir directory_path_libc_source/stdio-common

我尝试通过apt下载源代码,但是出现了错误apt-get source libc6 正在读取软件包列表... 完成 正在构建依赖关系树
正在读取状态信息... 完成 选择'eglibc'作为源软件包而不是'libc6' E: 无法找到eglibc的源软件包。所以我使用wget下载了我拥有版本的libc源代码。我使用设置目录绝对路径将source_path设置为libc源代码的根目录。但是在步进时,我仍然无法在GDB中看到libc的源代码。
- abhi
我按照您的指示纠正了apt-get源问题,并在一个目录中下载了libc6源代码。我使用简单的测试程序启动了gdb进行调试,该程序只有一个printf()函数,但是在步进代码时我仍然看不到源代码。请查看我在printf()函数上步进后的屏幕截图:https://www.dropbox.com/s/0z8btk672vfaxot/gdb.png - abhi
@abhi 你是否用dir命令添加了libc的源目录?我的意思是,从你的截图来看,它似乎不在gdb的源路径中。你也可以尝试运行info sources来检查一下吗? - jcm
这正是我所做的:1. gdb ./test -> dir directory_path_libc_source(路径显示在show dir中),然后在printf()之前设置断点并运行。 在触发断点时,我进行了信息源查询(https://www.dropbox.com/s/z7b2rcysxqoexju/gdb1.png),但无法看到代码。 在打印printf()时,它会说_printf(format=0x400594 "ABHI") at printf.c:30 30 printf.c: 没有那个文件或目录。 (gdb) s 34 in printf.c (gdb) s 30 in printf.c - abhi
@abhi 你是否将libc的调试信息文件添加到了LD_LIBRARY_PATH中? - jcm
显示剩余3条评论

0

下载 Glibc 源代码并将其路径与 gdb 调试器相同。请查看 Ubuntu 博客


我尝试了您提供的链接中给出的gdb命令,并将其路径设置为我拥有glibc源代码的目录。我使用了一个只有printf("ASAS")的主函数测试程序,但在到达printf()时,它没有进入libc中的printf()代码。我是否遗漏了什么? - abhi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接