LLDB 调试器无法识别在远程机器上编译的可执行符号

Zoh*_*r81 0 c debugging macos clang lldb

我正在 Xcode/clang 环境中的一台计算机上构建我的项目,我想在另一个站上的 lldb 调试器下运行它,而无需复制源代码、可执行文件和符号文件。

我已经复制了所有 dSYM 目录,以便 lldb 调试器可以识别我需要的符号并呈现真正的函数(目前我得到了像___lldb_unnamed_function532backtrace 命令一样的函数名称)

我尝试使用命令

settings set target.source_map /source_dir /target_dir
Run Code Online (Sandbox Code Playgroud)

wheretarget_dir代表我放置所有dSYM目录source_dir的路径,代表所有dSYM目录的原始父目录的路径。

不幸的是,除非源代码驻留在/target_dir.

我哪里做错了?

好的,所以我发现当我将 dSYM 目录复制到可执行文件的相同位置时,lldb 设法破译符号。有没有办法“告诉”lldb 到另一个位置?

ter*_*ill 5

要为 dSYM 指定不同的路径,您可以执行以下步骤:

首先使用以下命令为可执行文件生成 UUID:

xcrun dwarfdump --uuid 可执行文件路径

然后通过将前 20 个十六进制数字拆分为 4 个字符块并创建目录树来创建目录:每个后续目录都在前一个目录中创建。然后创建一个符号链接,其名称是最深目录中的最后 12 个十六进制数字。例如,如果生成的 UUID 是: 23516BE4-29BE-350C-91C9-F36E7999F0F1

然后制作文件夹: 2351/6BE4/29BE/350C/91C9/

和符号链接: F36E7999F0F1

符号链接值是包含 DWARF 的 dSYM 包内 mach-o 文件的完整路径。如果 dSYM 在 source/foo.dSYM/Contents/Resources/DWARF/foo 中,则链接必须是 source/foo.dSYM/Contents/Resources/DWARF/foo 的完整路径(参见下面的示例)。

最后一部分是告诉 DebugSymbols 使用以下命令检查此 UUID 文件映射缓存:

% 默认写入 com.apple.DebugSymbols DBGFileMappedPaths 路径到您的 uuids 树

例如,您可以将您创建的目录放在 ~/Library/SymbolCache/dsyms/uuids/(或您想要的任何位置)下,以便最终链接的完整路径为:~/Library/SymbolCache/dsyms/uuids/2351 /6BE4/29BE/350C/91C9/F36E7999F0F1

和命令:

% 默认写入 com.apple.DebugSymbols DBGFileMappedPaths ~/Library/SymbolCache/dsyms/uuids/

然后检查它:

默认读取 com.apple.DebugSymbols DBGFileMappedPaths

来源:http : //lldb.llvm.org/symbols.html,LLDB:添加符号文件?

我在我的 MAC OS X 上试过了:

xcrun dwarfdump --uuid ./a.out

UUID: 7C9D0D55-3882-3F1B-99CA-446AFF4B5D0E (x86_64) ./a.out

mkdir PAPERINO
mv a.out.dSYM/ PAPERINO/

mkdir -p ~/Library/SymbolCache/dsyms/uuids/
mkdir -p ~/Library/SymbolCache/dsyms/uuids/7C9D0/0D55/3882/3F1B/99CA
cd ~/Library/SymbolCache/dsyms/uuids/7C9D0/0D55/3882/3F1B/99CA/

ln -s ../../../<my path>/PAPERINO/a.out.dSYM/Contents/Resources/DWARF/a.out 446AFF4B5D0E
Run Code Online (Sandbox Code Playgroud)

最后我能够在 lldb 中列出源:

lldb ./a.out 
(lldb) target create "./a.out"
Current executable set to './a.out' (x86_64).
(lldb) source list
   6    {
   7        char input[40] = {'\0'};
   8        int count = 0;
Run Code Online (Sandbox Code Playgroud)