【问题标题】:GDB step into Dynamic linker(ld.so) codeGDB 步入动态链接器(ld.so)代码
【发布时间】:2013-12-05 13:04:49
【问题描述】:

每当我的普通c 代码中使用 ld.so 的代码时,我都想单步执行它。 我正在尝试在 TUI 模式下通过 GDB 编写代码流,您可以在单步执行代码时同时看到源代码和程序集。

为此,我还从 ubuntu 包管理器安装了 libc-dbg binutils-source 包。 GDB 可以找到ld.so 本身的调试符号,我可以进入使用si 的指令级别,但我无法进入源代码级别,因为GDB 无法找到ld.so 的源代码并显示@ 987654328@.

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

我正在使用Ubuntu 12.10 64bit 和GCC 4.8.2

【问题讨论】:

    标签: c linux linker gdb glibc


    【解决方案1】:

    如果你有 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 Reading package lists... Done Building dependency tree Reading state information... Done Picking 'eglibc' as source package 而不是'libc6' E: 找不到 eglibc 的源包。所以我为我拥有的版本做了一个 wget 的 libc 源。我使用设置目录绝对路径将 source_path 设置为 libc 源的根目录。但是我在步进时仍然看不到 GDB 中 libc 的源代码
    • @abhi 这意味着您错过了启用源存储库。您可以从“软件源”启用它们(您可以从“软件中心”的编辑菜单访问它,或者从命令行运行sofware-sources),您将看到“启用源代码存储库”
    • 我按照您的指示更正了 apt-get 源代码问题,并将 libc6 源代码下载到一个目录中。用简单的测试程序启动 gdb 来调试它只有一个 printf() 并且在单步执行代码时我仍然看不到源代码。在我踩到 printf() dropbox.com/s/0z8btk672vfaxot/gdb.png 之后看截图
    • @abhi 你有没有用dir 命令添加libc 的源目录?我的意思是,从您的捕获来看,它似乎不在 gdb 的源代码补丁中。您也可以尝试运行info sources 来检查它吗?
    • 这正是我所做的: 1. gdb ./test -> dir directory_path_libc_source(路径显示在show dir中)在printf()之前设置一个断点并运行。在点击断点时,我做了信息源(dropbox.com/s/z7b2rcysxqoexju/gdb1.png),但看不到代码。在点击 printf() 时,它在 printf.c:30 30 printf.c 处显示 _printf (format=0x400594 "ABHI"):没有这样的文件或目录。 (gdb) s 34 in printf.c (gdb) s 30 in printf.c
    【解决方案2】:

    在调试前下载Glibc源和路径与gdb相同。检查这个ubuntu blog

    【讨论】:

    • 我尝试了在您提供的链接中为 gdb 提供的命令,并为其提供了我拥有 glibc 源的目录的路径。我使用了一个测试程序,它只有一个带有 printf("ASAS") 的主程序,但是在到达 printf() 时它没有进入 libc 中的 printf() 代码。我错过了什么
    猜你喜欢
    • 2012-01-14
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 2017-03-29
    • 2017-12-25
    • 2015-09-20
    相关资源
    最近更新 更多