记一次艰难的 debug 历程

💡 原文中文,约7200字,阅读约需17分钟。
📝

内容提要

作者通过自定义 Lua 内存管理函数和使用蜜罐技术,定位到一个 C++ 模块写坏了 Lua VM 所使用的内存,发现了一个游戏项目的 bug。作者完善了 lua Alloc 函数,维护多个虚拟机的内存块,并在 ltask 的调度器中检查所有的蜜罐,提前发现了问题。最终发现 bug 出在一个开源模块中,只在高并发条件下被触发。

🎯

关键要点

  • 作者通过自定义 Lua 内存管理函数和蜜罐技术定位到 C++ 模块导致 Lua VM 内存损坏的问题。
  • 在更新游戏项目后,作者发现程序崩溃,经过调试发现是一个难缠的 bug。
  • 游戏引擎专为手机设计,使用 C/C++/Obj-C 编写,开发时通过 fileserver 进程与手机引擎内核交互。
  • 崩溃问题只在作者的开发机上出现,其他同事的机器未能重现,调试工作由作者负责。
  • 通过 git bisect 确定引发 bug 的提交,最终定位到一个优化虚拟文件系统的提交。
  • bug 可能与 Lua 虚拟机管理的内存被意外修改有关,且与并发执行相关。
  • 减少工作线程数量后,bug 消失,推测与同事机器上运行的监控程序有关。
  • 自定义 Lua Alloc 函数并使用蜜罐技术,成功捕获到内存被意外修改的情况。
  • 最终发现 bug 是由于 C 结构在 Lua 中的内存管理不当,导致高并发条件下的内存冲突。
  • 作者在解决问题后可以安心陪伴家人过节。
➡️

继续阅读