如何让CDT / GDB不要抱怨缺少glibc源?

时间:2016-11-25 13:15:48

标签: gdb glibc eclipse-cdt

我在Eclise CDT(使用GDB)中调试此应用程序,我得到以下内容:

... etc. ...
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Program received signal SIGINT, Interrupt.
2169    rtld.c: No such file or directory.
dl_main (phdr=<optimized out>, phnum=<optimized out>, user_entry=<optimized out>, auxv=<optimized out>) at rtld.c:2169

Temporary breakpoint 3, main (argc=3, argv=0x7fffffffd4a8) at /home/eyalroz/src/bbp-reader/src/main.cpp:104
... etc. ...

所以,看起来GDB正在寻找glibc&#39; s rtld.c的源文件。我可以下载源代码,但是 - 我该怎么办?我把它放在哪里?

(我正在使用Kubuntu 16.04 Linux)。

1 个答案:

答案 0 :(得分:2)

以下是一些步骤,它们将在理论上与任何包一起使用:

  1. 启用包管理器的来源

    我在XUbuntu上使用Synaptic,但您应该能够找到KUbuntu和您的包管理器的等效文件,或者直接编辑/etc/文件。

  2. 一个。打开Synaptic 湾来自设置菜单 - &gt;选择存储库 C。选中源代码复选框。 d。按关闭并重新加载源列表

    enable sources

    1. 下载libc6-dev的源代码。在没有sudo的空目录中,运行apt-get source libc6-dev。这将下载tar文件并应用您平台的所有补丁。在此之后,您应该有一个glibc-2.23/(或类似的)目录

    2. 在Eclipse CDT安装源查找中,将C库构建时的目录映射到您下载的位置。为此:

    3. 进入要调试的C库函数(在我的示例中,我使用的是puts),你最终应该找到源代码未找到的编辑器:

    4. source not found

      1. 该编辑器会显示构建路径。按定位文件... 按钮,浏览上面下载的特定源文件。这应该显示源文件。

      2. 步骤5在包含目录的启动配置中保存了路径。由于glibc很大并且包含多个目录,您可能希望将此更改应用于所有目录。要做到这一点:

      3. 使用步骤4中显示的路径,直到glibc目录(我的示例中为/build/glibc-Qz8a69/glibc-2.23)在Eclipse CDT中全局添加路径映射:

      4. 打开偏好设置 - &gt; C / C ++ - &gt; 调试 - &gt; 源查找路径

      5. 添加...

      6. 选择路径映射,按确定并输入您想要的任何名称。

      7. 按添加

      8. 编译路径中输入步骤7中的路径,并在本地文件系统路径中输入计算机上的相应目录。然后按OK。它现在应该是这样的:

      9. enter image description here

        1. 调试。
        2. 或者,您可以仅对单个启动配置进行更改。

          命令行GDB

          下载源后,您可以在命令行中使用GDB执行相同的操作。这是一个痕迹:

          $ gdb -q ./HelloSO 
          Reading symbols from ./HelloSO...done.
          (gdb) b main
          Breakpoint 1 at 0x40052a: file ../src/HelloSO.c, line 15.
          (gdb) set substitute-path /build/glibc-Qz8a69/glibc-2.23 /tmp/x/glibc-2.23
          (gdb) r
          Starting program: /scratch/jacob/workspace/HelloSO/Debug/HelloSO 
          
          Breakpoint 1, main () at ../src/HelloSO.c:15
          15      puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */
          (gdb) s
          _IO_puts (str=0x4005c4 "!!!Hello World!!!") at ioputs.c:33
          33  {
          (gdb) s
          35    _IO_size_t len = strlen (str);
          (gdb)