GDB使用绝对路径设置断点

我正在尝试调试使用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,我尝试了此操作,因为这是成功命令输出的内容。令人惊讶的是,它没有用,这确实让我感到困惑。
  • 从根目录和其他目录运行gdb。
  • 启动gdb后,对各个目录执行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构建的真实项目的完整路径。

lhfeic 回答:GDB使用绝对路径设置断点

tldr,使用gdb --readnow解析。

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

1)如果我使用较少的调试详细信息进行构建,问题就消失了。但是,那时我将无法检查表达式和变量。因此,我认为问题可能与gdb没有足够的内存或缓存来加载所有调试信息有关。这听起来很合理,因为项目源代码包含100,000个文件。

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

我了解了infoinfo setinfo 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,绝对路径也可以工作。

本文链接:https://www.f2er.com/2903570.html

大家都在问