LLDB调试器不识别在远程计算机上编译的可执行符号

时间:2015-11-05 09:46:34

标签: c macos debugging clang lldb

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

我已经复制了所有dSYM目录,因此lldb调试器可以识别我需要的符号并显示实际函数(目前我在backtrace命令中获得了___lldb_unnamed_function532等函数名称)

我尝试使用命令

settings set target.source_map /source_dir /target_dir

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

不幸的是,除非源代码驻留在/target_dir上,否则它不起作用。

我哪里出错了?

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

1 个答案:

答案 0 :(得分:2)

要为dSYM指定其他路径,您可以执行以下步骤:

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

xcrun dwarfdump --uuid path-to-executable

然后通过将前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.htmlLLDB: 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] = {'\0'};
   8        int count = 0;