Xcode 生成的 DWARF 文件中的相对路径

Posted

技术标签:

【中文标题】Xcode 生成的 DWARF 文件中的相对路径【英文标题】:Relative path in Xcode generated DWARF file 【发布时间】:2017-05-27 15:38:00 【问题描述】:

当我编译我的 swift 框架 MyFramework 时,我让 Xcode 生成 MyFramework.framework(已编译的框架)和 MyFramework.framework.dSYM(dSYM 文件)。

通过运行dwarfdump myframework.framework.dSYM/Contents/Resources/DWARF/MyFramework,我注意到源文件的所有路径都是绝对路径。

这使得无法与我的同事共享这两个工件(连同源代码)并允许他们使用已编译的框架并能够正确调试他们的代码。更准确地说,他们无法使用调试器进入框架。

因此他们需要重新编译框架,这很不方便。

有没有办法修改 DWARF 以编辑这些路径,或者更好地说服 Xcode 在 DWARF 文件中使用相对路径?

【问题讨论】:

【参考方案1】:

虽然我不知道如何更改存储在 dSYM 中的路径或使它们相对,但我可以提供一种解决问题的方法,并能够在具有源代码的任意机器上使用这些符号进行调试代码在不同的基本路径中。

一旦您找出原始路径是什么(例如 /Users/rob/src/Project),并且您拥有该库的代码,例如/Users/luka/Sources/Project,然后你可以发出这个 lldb 命令,它将调试器的那个会话用你的路径替换原始路径:

settings set target.source-map /Users/rob/src/Project /Users/luka/Sources/Project

很遗憾,您需要为每个调试会话运行此命令。为此,您可以在 main 中创建一个断点,它会运行该命令并继续执行而不会停止。

要查找原始源路径,您可以使用dwarfdump,或者您可以使用im loo -v -n MySymbol 或通过命令的其他参数从lldb 中查找您知道该二进制文件中的符号(取决于您尝试使用的符号类型)。

【讨论】:

这是一个不错的技巧。但是我们在 Playgrounds 中遇到了同样的问题。 Playgrounds 是否有等效的命令?

以上是关于Xcode 生成的 DWARF 文件中的相对路径的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Xcode 不为静态库生成 dSYM

如何在 Xcode 项目设置中使用相对路径?

Firebase Crashlytics DSYM 文件

Xcode:如何将当前工作目录设置为可执行文件的相对路径?

xCode 5.1 无法识别文件系统中“相对于文件夹”(真实文件夹)中的类

dsym 文件的结构是啥?