【问题标题】:How can I make CDT / GDB not complain about missing glibc sources?如何让 CDT / GDB 不抱怨缺少 glibc 源?
【发布时间】:2017-04-09 21:52:53
【问题描述】:

我正在 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 的 rtld.c 的源文件。我可以下载源代码,但是 - 我该如何处理它们?我应该把它们放在哪里?

(我使用的是 Kubuntu 16.04 Linux)。

【问题讨论】:

    标签: gdb glibc eclipse-cdt


    【解决方案1】:

    这里有一些步骤,它们(理论上)适用于任何包:

    1. 为您的包管理器启用源

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

    一个。打开突触 湾。从 Settings 菜单 -> 选择 Repositories C。选中源代码复选框。 d。按关闭并重新加载源列表

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

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

    3. 进入您要调试的 C 库函数(在我的示例中,我使用的是 puts),您最终应该得到如下所示的 source not found 编辑器:

    1. 该编辑器向您显示构建路径。按 Locate File... 按钮并浏览您在上面下载的特定源文件。这应该会显示源文件。

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

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

    4. 打开首选项 -> C/C++ -> 调试 -> 源查找路径

    5. 添加...

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

    7. 按添加

    8. 编译路径中输入第7步的路径,在本地文件系统路径中输入您机器上的相应目录。然后按确定。现在应该是这样的:

    1. 调试。

    或者,您可以仅对单个启动配置进行更改。

    命令行 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) 
    

    【讨论】:

      猜你喜欢
      • 2018-06-25
      • 1970-01-01
      • 1970-01-01
      • 2015-10-31
      • 1970-01-01
      • 2013-05-03
      • 2023-03-03
      • 1970-01-01
      • 2021-11-30
      相关资源
      最近更新 更多