iOS 调试 Rust

3,773 阅读3分钟

我们基于上次的文章尝试在 iOS 上Debug Rust,iOS 编译和部署 Rust Library,而且我这里假设那篇文章中提到的工具你都已安装成功。

我们的 debug 项目仍然是上篇文章的 debug 项目,项目地址在 GitHub 上。

下载下来以后可以看到 basic 文件夹,里面有 ios 文件夹,打开 iOS 项目,运行。可以看到如下界面。

输入你的名字,点击 “Greet me!”,可以看到 Rust 代码 work 了。

好,接下来,我们开始尝试直接 debug rust 项目。

我们先用 Clion 打开 rust 项目,项目地址在 basic/cargo 下。同时我们可以看到在 rust 编译产物文件夹 basic/cargo/target/ 中有很多不同平台的产物。我们是基于 iOS 模拟器调试的,所以我们关注的平台是 x86_64

我们先清空 target 这个文件夹,然后在 Clion 的 terminal 中键入 cargo lipo --targets x86_64-apple-ios,上篇文章中说了 lipo 是跨平台产物构建的利器,现在我们使用它来构建一个模拟器的产物。现在回车,我们可以看到 lipo 提示我们完成,并且说明了产物是 [unoptimized + debuginfo],意思产物构建时没有优化,并且产物带上了吗debuginfo。我们知道 LLVM 编译 release 包的时候会做一些优化,代码的位置相对于我们源码会有变化,那么这和我们 debug 是有冲突的,我们希望我们打的断点就在真实的源码位置,所以在 debug 产物,默认是把优化关闭了的。而且,我们源码和编译产物的映射是存在 debuginfo 中的,所以 Rust 帮我们带上了 debuginfo

现在我们看到 target 文件夹如下。这个 x86_64 的产物就是我们模拟器需要的。

现在我们再回到 iOS 项目处,重新编译,这个时候发现编译会失败。Xcode 说链接不到 Rust 产物。确实链接不到了,我们已经把原来的包删了。

我们需要重新告诉 Xcode 如何链接我们的 Rust 库。我们把旧的链接给删除,然后添加我们新的带debuginfo 的包所在的 debug 路径。

好,现在我们重新运行,发现能运行成功了。OK,Stop Xcode 的运行。直接在模拟器启动刚才的 Greetings 应用。

我们现在去到 Clion,按图选择 Attach to Process。

此时会出现如下界面,键入我们的 APP 名称 Greetings。点选他。

然后可以看到 Clion attach 我们的应用成功。

我们现在去到 Rust 代码中打一个断点。然后再去模拟器中输入自己名字,点击 “Greet me!”。发现断点已经命中了。

但是这还不够,因为等 APP 完全启动以后再开始 debug 这不能覆盖我们所有 debug场景,比如有很多 APP 一启动就要做的事情我们没法直接 debug。我会在下一篇文章和大家分享如何处理这种场景。敬请期待。

另外现在支持 Rust 项目 debug 的只有 Clion,所以安卓项目可能还需要等到 Rust 插件支持 Intellij 或者 Android Studio 的时候才可以支持真机调试。对了,官方进度在这里 GitHub

在 Xcode 中 debug Rust 请看 Xcode 调试 Rust

Enjoy! 😁