LLDB 调试器无法识别在远程机器上编译的可执行符号
LLDB debugger doesn't identifying executable symbols that compiled on remote machine
我正在 Xcode/clang 环境中的一台计算机上构建我的项目,我想 运行 在另一台站上的 lldb 调试器下,不复制源代码,只复制可执行文件,和符号文件。
我已经复制了所有的 dSYM 目录,这样 lldb 调试器就可以识别我需要的符号并呈现真正的函数(目前我在 backtrace 命令中得到的函数名称如 ___lldb_unnamed_function532
)
我尝试使用命令
settings set target.source_map /source_dir /target_dir
其中target_dir
表示我放置所有dSYM目录的路径,
source_dir
代表所有dSYM目录的原始父目录路径。
不幸的是,除非源代码驻留在 /target_dir
上,否则它不起作用。
我哪里错了?
好的,所以我发现当我将 dSYM 目录复制到可执行文件的相同位置时,lldb 设法破译符号。有什么方法可以 "tell" lldb 用于另一个位置?
要为 dSYM 指定不同的路径,您可以执行以下步骤:
首先使用以下命令为可执行文件生成 UUID:
xcrun dwarfdump --uuid 可执行文件路径
然后通过将前 20 个十六进制数字分成 4 个字符块并创建目录树来创建目录:每个后续目录都在前一个目录中创建。然后在最深目录下创建一个symlink,名称为最后12位十六进制数字。
例如,如果生成的 UUID 是:
23516BE4-29BE-350C-91C9-F36E7999F0F1
然后制作文件夹:2351/6BE4/29BE/350C/91C9/
和 Symlink:
F36E7999F0F1
symlinks 值是包含 DWARF 的 dSYM 包内的 mach-o 文件的完整路径。
如果 dSYM 在 source/foo.dSYM/Contents/Resources/DWARF/foo,
那么 link 必须是 source/foo.dSYM/Contents/Resources/DWARF/foo 的完整路径(参见下面的示例)。
最后一部分是告诉 DebugSymbols 使用以下命令检查此 UUID 文件映射缓存:
% 默认写入 com.apple.DebugSymbols DBGFileMappedPaths 路径到你的 uuids 树
例如,您可以将创建的目录放在 ~/Library/SymbolCache/dsyms/uuids/(或任何您想要的位置)下,这样最终 link 的完整路径将是:~/Library/SymbolCache/dsyms/uuids/2351/6BE4/29BE/350C/91C9/F36E7999F0F1
和命令:
% 默认写入 com.apple.DebugSymbols DBGFileMappedPaths ~/Library/SymbolCache/dsyms/uuids/
然后检查:
默认读取com.apple.DebugSymbolsDBGFileMappedPaths
来源:http://lldb.llvm.org/symbols.html, LLDB: add symbols file?
我在 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
最后我能够在 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] = {'[=11=]'};
8 int count = 0;
我正在 Xcode/clang 环境中的一台计算机上构建我的项目,我想 运行 在另一台站上的 lldb 调试器下,不复制源代码,只复制可执行文件,和符号文件。
我已经复制了所有的 dSYM 目录,这样 lldb 调试器就可以识别我需要的符号并呈现真正的函数(目前我在 backtrace 命令中得到的函数名称如 ___lldb_unnamed_function532
)
我尝试使用命令
settings set target.source_map /source_dir /target_dir
其中target_dir
表示我放置所有dSYM目录的路径,
source_dir
代表所有dSYM目录的原始父目录路径。
不幸的是,除非源代码驻留在 /target_dir
上,否则它不起作用。
我哪里错了?
好的,所以我发现当我将 dSYM 目录复制到可执行文件的相同位置时,lldb 设法破译符号。有什么方法可以 "tell" lldb 用于另一个位置?
要为 dSYM 指定不同的路径,您可以执行以下步骤:
首先使用以下命令为可执行文件生成 UUID:
xcrun dwarfdump --uuid 可执行文件路径
然后通过将前 20 个十六进制数字分成 4 个字符块并创建目录树来创建目录:每个后续目录都在前一个目录中创建。然后在最深目录下创建一个symlink,名称为最后12位十六进制数字。 例如,如果生成的 UUID 是: 23516BE4-29BE-350C-91C9-F36E7999F0F1
然后制作文件夹:2351/6BE4/29BE/350C/91C9/
和 Symlink: F36E7999F0F1
symlinks 值是包含 DWARF 的 dSYM 包内的 mach-o 文件的完整路径。 如果 dSYM 在 source/foo.dSYM/Contents/Resources/DWARF/foo, 那么 link 必须是 source/foo.dSYM/Contents/Resources/DWARF/foo 的完整路径(参见下面的示例)。
最后一部分是告诉 DebugSymbols 使用以下命令检查此 UUID 文件映射缓存:
% 默认写入 com.apple.DebugSymbols DBGFileMappedPaths 路径到你的 uuids 树
例如,您可以将创建的目录放在 ~/Library/SymbolCache/dsyms/uuids/(或任何您想要的位置)下,这样最终 link 的完整路径将是:~/Library/SymbolCache/dsyms/uuids/2351/6BE4/29BE/350C/91C9/F36E7999F0F1
和命令:
% 默认写入 com.apple.DebugSymbols DBGFileMappedPaths ~/Library/SymbolCache/dsyms/uuids/
然后检查:
默认读取com.apple.DebugSymbolsDBGFileMappedPaths
来源:http://lldb.llvm.org/symbols.html, LLDB: add symbols file?
我在 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
最后我能够在 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] = {'[=11=]'};
8 int count = 0;