介绍

项目使用的是 Unity 5.3,现在依然需要维护。项目使用 C# + Lua 开发,但是现有工具无法调试。

环境

  • Windows 10 21H2
  • Unity 5.3.8f2
  • xLua v2.1.6

C#

因为平时比较喜欢使用 Rider,因此选择使用 Rider 进行 C# 调试。

使用 Rider 2020.3 与 Rider 2021.3 都无法进行断点调试。需要尝试使用 Unity 5.3 发布时对应的 Rider 版本,Rider 最早版本是 2017.1。考虑到稳定性,尝试使用 Rider 2017.3,安装后断点调试成功。

在 Unity 中配置 Rider 为编辑器后打开工程,Rider 会自动安装 Unity 插件,再切换回 Unity 就可以使用了。

Lua

修复问题

按照 EmmyLua 文档配置调试后发现无法断点,但是使用 dbg.breakHere() 却可以断点。

在断点后发现调用堆栈中的信息是 Lua.Lua.UI.Example::307,而不像其他可以断点调试的项目中的路径 Lua/UI/Example.lua.txt::351,因此怀疑是路径导致无法断点调试,将路径修改为 Lua 文件的相对路径(包含扩展名)后,就可以正确调试了。

后续在 EmmyLua 官方文档下面的评论中找到了另一个回答,也是相同的问题,在打印断点时的路径时发现了问题。

方案总结

为了支持正确调试 Lua,必须将 xLua 加载的 Lua 文件路径设置为正确的相对路径,即必须可以通过路径访问到文件:

  1. 必须是相对路径。
  2. 必须包含文件的扩展名,如果实际扩展名是 lua.txt,那就不能简写为 lua

xLua 的 CustomLoaderDoString 方法都需要修改。

配置方法

实测这两种组合都可以断点调试:

  • IntelliJ Idea 2019.2.4 Community + EmmyLua 1.3.0.131-IDEA182
  • Rider 2017.3.1 + EmmyLua 1.3.2.142-IDEA172

配置过程

  • 在 IDE 的 Run/Debug Configurations 中增加 Emmy Debugger(NEW) 配置,命名为 Emmy Debugger
  • 将上一步配置中的调试代码复制到首个加载的 Lua 文件最后。
  • 配置完成,现在可以在 Lua 代码中设置断点,在 Debug 配置中选择 Emmy Debugger 并点击 Debug 按钮(在 Unity 运行加载完调试代码后),就可以正确触发断点了。

下载地址

总结

项目使用的 Unity 版本比较旧,并且没有调试文档,导致无法调试。手动排查问题修复到可以调试后,将调试相关的软件版本及调试方法写成文档,提交到项目仓库中,方便后续人员开发。

其实就算是最新版本的软件,在未来也会变成旧版软件,因此一定要记录保留当时可用的组合。使用的 IDE、插件、操作系统版本等等,这些信息可能当时觉得没什么用,但是后续在重建现场进行维护时才会发现这些信息的重要性。