在Xcode中将源代码附加到二进制dylib文件

21

我在我的iOS应用程序中有一个框架和动态库,该库是在另一台机器上编译的。 我在我的机器上签出了源代码并尝试使用以下命令指示lldb将源代码路径映射:

settings set target.source-map /source/code/path/in/dylib/prefix /source/code/path/on/my/machine/prefix

还是徒劳无功,仍然看到了汇编代码。

备注#1:dylib从C++代码编译而来,使用的是相同版本的Xcode。

备注#2:我使用命令nm -pa /path/to/dylib来确定文件路径是否嵌入调试信息中,它们确实被嵌入了,但lldb由于某种原因不能正常工作。

谢谢

更新

我按照Jim Ingham的答案创建了一个脚本来自动化这个过程,该脚本可在我撰写的文章中的gist链接中找到:https://medium.com/@maxraskin/background-1b4b6a9c65be

1个回答

16

在另一台机器上调试代码,需要构建一个dSYM并确保在进行调试的机器上可用。如果您没有这样做,什么都不会起作用。

接下来要检查的是lldb是否正在使用dSYM。此页面对此过程有一些描述:

http://lldb.llvm.org/symbols.html

但如果所有其他方法都失败了,则可以使用add-dsym命令手动添加。

如果仍然无法解决问题,请选择dylib中的一些符号,并执行以下操作:

(lldb) image lookup -vn <SYMBOL_NAME>

或者在已加载的动态库中找到某个地址并执行:

(lldb) image lookup -va <ADDRESS>

如果lldb找到了dSYM并且调试信息正确,其中一行输出应该是"Compile Unit"的入口。那就是调试信息所说的源文件路径。该路径的适当基础是您应该在target.source-map中使用的内容。如果您没有看到该条目,则表示该编译单元的调试信息已经以某种方式丢失。

如果所有这些都看起来不错,但lldb仍然无法看到源文件,则很可能是遇到了错误,此时请向http://bugreporter.apple.com报告错误。


感谢您详细的回复,这很有用,我确实缺少了dSYM。我使用了add-dsym并指出了dSYM路径,然后我使用了image lookup -vn <SYMBOL_NAME>来获取符号源代码路径,然后使用settings set target.source-map /path/prefix/i/got/from/lookup /path/prefix/on/my/machine来更改映射。 - Max Raskin
顺便问一下-对于dylib的调试版本,是否需要dSYM,或者相同的数据是否嵌入在dwarf文件中? - Max Raskin
2
在OS X上,编译器将调试信息写入.o文件,并在最终的二进制映像中编写“调试映射”,告诉lldb如何找到.o文件并链接其中的dwarf。因此,如果您正在就地调试,则不需要dSYM。但是,如果您在删除了Intermediates文件夹的情况下调试二进制文件,或者在没有该目录或在不同位置拥有该目录的计算机上进行调试,则需要创建dSYM并使用dSYM进行调试。 - Jim Ingham
不确定是否是同一个问题,但在使用 Flex 时,我没有看到派生源代码与调试相关联。 派生源的路径如 Project/Build/Intermediates/XCodeSnaz.build/Debug/XCodeSnaz.build/DerivedSources/lexer.yy.cpp。该文件可以通过 'image lookup -vn cFlexLexer' 找到,但没有源代码关联。 - Konchog
更新的链接:https://lldb.llvm.org/use/symbols.html - user1763487

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接