GDB使用绝对路径设置断点

GDB使用绝对路径设置断点,gdb,clion,gdbserver,Gdb,Clion,Gdbserver,我正在调试一个用Ninja编译的应用程序 我有我的源代码/usr/local/…project src/ 我的构建输出位于/usr/local/…project src/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

我正在调试一个用Ninja编译的应用程序

  • 我有我的源代码
    /usr/local/…project src/

  • 我的构建输出位于
    /usr/local/…project src/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.
    
  • 信息源
    打印
    无当前源文件。

  • dir
    打印搜索到的
    源目录:/usr/local/…project src/out/Debug:$cdir:$cwd

我也试过:

  • b.././x/y.cc
    ,我尝试了这个方法,因为这是成功的命令输出的结果。令人惊讶的是,它不起作用,这让我很困惑
  • 从根目录和其他目录运行gdb
  • 启动gdb后对各个目录执行
    cd
  • 乱搞
    设置替换路径
    并使用
    dir添加目录
我希望解决方案很简单,因为断点、变量值和其他一切都可以工作,只是绝对路径不行

同样值得注意的是,一旦我成功地将断点添加到文件中(使用相对路径),其他路径也可以工作(绝对路径和
。/../x/y.cc
路径)

最后,至于我为什么希望绝对路径工作,我正在使用CLion的远程gdb配置连接到gdbserver,CLion出于任何原因使用绝对路径。也许有一种方法可以将CLion配置为只使用
x/y.cc
?我使用
gdbserver:2000out/Debug/build
运行gdbserver,并配置了CLion的目标远程、符号文件和sysroot。我还尝试在CLion中设置路径映射


编辑,使用
g++-g
而不是
ninja
在虚拟HelloWorld项目上测试构建,我能够使用绝对路径添加断点,例如
b/usr/local/…untitled/main.cpp:4
。因此,出于某种原因,
gdb
支持使用g++构建的HelloWorld项目的完整路径,但不支持使用Ninja构建的真实项目。

tldr,使用
gdb--readnow
解决

根据评论建议,我开始深入我的构建配置。我注意到两件事:

1) 如果我使用更少的调试细节构建,问题就会消失。但是那样我就不能检查表达式和变量了。所以我认为这个问题可能与gdb没有足够的内存或缓存来加载所有调试信息有关。这听起来很合理,因为项目源代码包含100000个文件

2) 如前所述,在使用相对路径向同一文件添加断点后,我可以使用绝对路径添加断点

我学习了
info
info-set
info-sources
命令。尽管轻量级调试构建和完整调试构建(步骤1)之间的输出相同,但我注意到
info sources
的输出在步骤2中发生了变化。在我使用相对路径添加断点之前,`info sources将在`source files WITH SYMBOL WITH WITH WITH read in AND demand in'下列出所有源文件。但是在添加一个相对断点之后,一些文件(我认为当前帧上的文件)将被添加到加载的源文件中

所以我去寻找一种方法,告诉gdb加载所有源文件,并发现了
gdb--readnow
标志(或者
file--readnow
带有一个破折号
-
),尽管它打印了一堆警告消息,但似乎解决了我的问题

尽管如此,我从未发现如何配置CLion以使用
readnow
标志。最新的EAP(2019.3)版本据说支持配置每个项目的
.gdbinit
文件,尽管我还没有尝试过。我也不知道
readnow
是否可以在
.gdbinit
文件中配置,因为它不是一个设置。在本次调查中,当我想到如何在CLion中正确配置自定义构建目标和应用程序时,我有点回避了整个配置CLion的问题

编辑


还有一个解决办法。如果我将
cd
插入包含构建文件的
/usr/local/…project src/out/Debug
(与
/usr/local/…project src/
相反),那么即使没有
readnow
,绝对路径也可以工作?到目前为止,我试图复制这个问题,但没有任何运气。8.3-gg4。当您无法复制时,您的意思是1)您可以使用绝对路径添加断点,还是2)CLIion使用相对路径而不是绝对路径?我使用绝对路径在二进制文件中设置断点,该二进制文件使用相对路径编译,似乎与您拥有的相匹配。我还设置了一个类似于您的目录结构。如果您在Linux上运行,您可以尝试在strace下运行GDB,搜索日志以查看GDB在搜索源文件时实际尝试访问的路径。您的更新谈到了使用g++与ninja进行构建,但ninja是一个构建系统,而不是编译器,因此它仍然使用编译器(可能是g++)来编译您的代码,您应该了解最初实际使用的标志。这非常有帮助。我将深入研究我的构建配置。这是一个非常好的发现,我认为您应该接受自己的答案。关于使用
.gdbinit
文件的
readnow
选项,您是否尝试过
符号文件-readnow
命令?我想这应该可以做到。是的,这“有效”,因为它允许具有绝对路径的断点。虽然我应该提到我有多个构建(符号文件)。理想情况下,我希望gdbinit设置一些“always readnow”设置
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.