我在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)。
答案 0 :(得分:2)
以下是一些步骤,它们将在理论上与任何包一起使用:
启用包管理器的来源
我在XUbuntu上使用Synaptic,但您应该能够找到KUbuntu和您的包管理器的等效文件,或者直接编辑/etc/
文件。
一个。打开Synaptic 湾来自设置菜单 - &gt;选择存储库 C。选中源代码复选框。 d。按关闭并重新加载源列表
下载libc6-dev的源代码。在没有sudo的空目录中,运行apt-get source libc6-dev
。这将下载tar文件并应用您平台的所有补丁。在此之后,您应该有一个glibc-2.23/
(或类似的)目录
在Eclipse CDT安装源查找中,将C库构建时的目录映射到您下载的位置。为此:
进入要调试的C库函数(在我的示例中,我使用的是puts),你最终应该找到源代码未找到的编辑器:
该编辑器会显示构建路径。按定位文件... 按钮,浏览上面下载的特定源文件。这应该显示源文件。
步骤5在包含目录的启动配置中保存了路径。由于glibc很大并且包含多个目录,您可能希望将此更改应用于所有目录。要做到这一点:
使用步骤4中显示的路径,直到glibc目录(我的示例中为/build/glibc-Qz8a69/glibc-2.23
)在Eclipse CDT中全局添加路径映射:
打开偏好设置 - &gt; C / C ++ - &gt; 调试 - &gt; 源查找路径
按添加...
选择路径映射,按确定并输入您想要的任何名称。
按添加
在编译路径中输入步骤7中的路径,并在本地文件系统路径中输入计算机上的相应目录。然后按OK。它现在应该是这样的:
或者,您可以仅对单个启动配置进行更改。
下载源后,您可以在命令行中使用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)