用于指定源搜索路径的 LLDB 等效于 gdb“目录”命令?

Posted

技术标签:

【中文标题】用于指定源搜索路径的 LLDB 等效于 gdb“目录”命令?【英文标题】:LLDB equivalent of gdb "directory" command for specifying source search path? 【发布时间】:2012-10-10 00:45:36 【问题描述】:

正在寻找 gdb "directory" 命令的 lldb 等效项以添加搜索路径以查找丢失的源代码(或可能在 xcode 中的类似功能)?

提前致谢!

【问题讨论】:

【参考方案1】:

target.source-map 设置允许您在调试会话中定义一系列a => b 路径重新映射。它与 gdb dir 命令不同,后者是一个目录列表,用于按基本名称搜索源文件,但您可以使用 source-map 解决相同的问题。这是我在编译后将源文件移动到隐藏目录的示例:

% cd /tmp
% echo 'int main ()  ' > a.c
% clang -g a.c
% mkdir hide
% mv a.c hide/
% xcrun lldb a.out
(lldb) settings set target.source-map /tmp /tmp/hide
(lldb) l -f a.c
   1    int main ()  
(lldb) br se -n main
Breakpoint created: 1: name = 'main', locations = 1
(lldb) r
Process 21674 launched: '/private/tmp/a.out' (x86_64)
Process 21674 stopped
* thread #1: tid = 0x1f03, 0x0000000100000f49 a.out`main + 9 at a.c:1, stop reason = breakpoint 1.1
    #0: 0x0000000100000f49 a.out`main + 9 at a.c:1
-> 1    int main ()  
(lldb) 

有关此设置的详细信息,请在 lldb 中键入 set list target.source-map。 fwiw 你可能已经通过 apropos path 在 lldb 中发现了这一点,这将列出名称/描述中包含单词 path 的所有命令/设置。看到有这个名称的设置,你会做settings list 来查看设置列表并发现它在target. 下归档。

【讨论】:

Jason,感谢您阐明用法并提供了一个很好的不言自明的示例! (“一张图片胜过一千字” ;-) 希望您不介意使用此示例作为更新“GDB TO LLDB 命令映射”(lldb.llvm.org/lldb-gdb.html)的建议。 /问候,拉斯。 是的,唯一的问题是 target.source-map 和 dir 不是一回事;它相当于 gdb 的路径名替换设置。 Xcode 在幕后使用了 pathname-substitutions,但用户通常不知道它。我们需要在某个时候向 lldb 添加一个类似于 gdb 的 dir 命令的命令。 关于这个答案我唯一想念的就是如何找到构建它时使用的源路径。如果我连接到远程机器,我经常不知道使用了什么路径,我希望可以让lldb告诉我它想在什么路径中找到源文件,这样我就可以正确地进行源映射。 最简单的方法:使用image lookup --verbose --address $pc(或im loo -va $pc获取有关您当前正在执行的位置的所有信息。您也可以给image lookup一个函数名称或其他任何东西。你也可以使用 python 脚本接口来获取当前堆栈帧的文件名,例如script print lldb.frame.GetCompileUnit().GetFileSpec() 如果 lldb 找不到我需要的文件(例如,l foo.cc:1error: Could not find source file "foo.cc".)那又如何? gdb 的directory 很容易说看这里!,但在 lldb 中似乎没有解决方案,除非你知道它在哪里试图找到文件,这样你才能给出正确的参数到target.source-map,但它也没有告诉你。【参考方案2】:

lldb 无法找到您的源文件的问题可能是由有缺陷的编译过程引起的 - 我花了几个小时试图找到一个 lldb 命令来强制设置源路径但最终发现我在我的Makefile 中使用相同的标志集(-Wall -Werror -Wextra -g)执行了实际编译和链接......因此尽管确实存在错误(或被视为错误的警告),但编译器在没有警告和错误消息的情况下工作。修复它们修复了lldb 工作流程。也许开发人员应该考虑添加一些警告(对于像我这样的新手),以防程序无法找到源(它们位于 src 文件夹中的同一目录中)。

【讨论】:

以上是关于用于指定源搜索路径的 LLDB 等效于 gdb“目录”命令?的主要内容,如果未能解决你的问题,请参考以下文章

LLDB使用篇(上)

lldb调试器知多少

Rust LLDB 调试入门指北

在 QtCreator 命令行上指定 GDB 启动脚本

在QtCreator命令行上指定GDB启动脚本

VsCode 执行 debug(lldb/gdb) 命令