我正在尝试调试使用Ninja编译的应用程序。
我有我的源代码/usr/local/...project-src/
我的构建输出位于/usr/local/...project-src/out/Debug/build
编译后的输出包含调试信息
file out/Debug/build
包括:
ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, with debug_info, not stripped
使用相对路径时,我可以添加断点:
cd /usr/local/...project-src
gdb
file out/Debug/build
b x/y.cc:34
# success
Breakpoint 1 at <mem-loc>: file ../../x/y.cc, line 34.
但是当我使用绝对路径时,它会失败
cd /usr/local/...project-src
gdb
file out/Debug/build
b /usr/local/...project-src/x/y.cc
# failure
No source file named /usr/local/...project/x/y.cc.
info source
打印No current source file.
dir
打印Source directories searched: /usr/local/...project-src/out/Debug:$cdir:$cwd
我也尝试过:
b ../../x/y.cc
,我尝试了此操作,因为这是成功命令输出的内容。令人惊讶的是,它没有用,这确实让我感到困惑。cd
set substitute-path
聊天,并使用dir
添加目录我希望解决方案很简单,因为断点和变量值以及其他所有方法都可以工作,只是不能使用绝对路径。
另外值得注意的是,一旦我成功地向文件添加了一个断点(使用相对路径),其他路径也就可以了(绝对路径和../../x/y.cc
路径)。
最后,关于我为什么要使用绝对路径的原因,我正在使用CLion的remote-gdb配置连接到gdbserver,而CLion出于任何原因都在使用绝对路径。也许有一种方法可以将CLion配置为仅使用x/y.cc
?我正在使用gdbserver :2000 out/Debug/build
运行gdbserver并配置了CLion的目标远程,符号文件和sysroot。我也尝试过在CLion中设置路径映射。
编辑,使用g++ -g
而不是ninja
在虚拟HelloWorld项目上进行测试,我可以使用绝对路径添加断点,例如b /usr/local/...untitled/main.cpp:4
。出于某种原因,gdb
似乎支持使用g ++构建的HelloWorld项目的完整路径,但不支持使用Ninja构建的真实项目的完整路径。
答案 0 :(得分:1)
tldr,使用gdb --readnow
解析。
根据评论建议,我开始深入研究我的构建配置。我注意到的两件事:
1)如果我使用较少的调试详细信息进行构建,问题就消失了。但是,那时我将无法检查表达式和变量。因此,我认为问题可能与gdb没有足够的内存或缓存来加载所有调试信息有关。这听起来很合理,因为项目源代码包含100,000个文件。
2)如前所述,我可以使用绝对路径添加断点 之后,我已经使用相对路径向同一文件添加了断点。
我了解了info
,info set
和info sources
命令。尽管在轻量级调试版本和完整调试版本(步骤1)之间的输出相同,但我注意到info sources
的输出在步骤2中发生了变化。在使用相对路径添加断点之前, “信息源”将在“将按需读取其符号的源文件”下列出所有源文件。但是在添加了相对断点后,会将一些文件(我认为当前帧上的文件)添加到已加载的源文件中。
因此,我去寻找一种方法来告诉gdb加载所有源文件,并发现了gdb --readnow
标志(或file <built-file> -readnow
并带有破折号-
),尽管它可以打印出一堆警告消息,似乎可以解决我的问题。
话虽这么说,但我从未发现如何配置CLion以使用readnow
标志。据说最新的EAP(2019.3)版本支持每个项目单独配置.gdbinit
文件,尽管我没有尝试过。我也不知道是否可以在readnow
文件中配置.gdbinit
,因为它不是设置。当我弄清楚如何在此调查中正确配置CLion中的自定义构建目标和应用程序时,我有点绕过了整个CLion配置问题。
修改
另一个解决方法。如果我cd
进入包含构建文件的/usr/local/...project-src/out/Debug
(与/usr/local/...project-src/
相对),那么即使没有readnow
,绝对路径也可以工作。