木匣子

Web/Game/Programming/Life etc.

在 mac osx 下进行 ulua 远程调试

更新于 2015/10/13: ulua 最新版已经直接支持 mac 调试:ulua怎么与ZeroBrane Studio联合调试?

ulua 是一款 unity3d 4.6/5.1 插件,能够使用 lua 语言进行 unity3d 游戏开发。但使用嵌入式脚本语言进行游戏开发带来便利的同时也对调试程序也带来了各种考验。

有幸找到 MobDebug ,一款用于远程调试 Lua 的神器。集服务端与客户端于一身,集成于多种 Lua IDE 中,例如 ZeroBrane Studio 。于是我打算尝试使用 ZeroBrane Studio 对运行中的 ulua 进行远程调试。

0x00 Getting Started

LuarRocks 是一个用于 Lua 的包管理器,在 Mac OSX 上的安装方法见此文档

使用它安装 MobDebug 非常快捷:

$ luarocks install mobdebug

然后在游戏的 main.lua 脚本的第一行加上:

require("mobdebug").start()

启动 ZeroBrane Studio 选择游戏项目所在目录;
执行 Project > Start Debugger Server ;

等待游戏客户端启动后,即可在 ZeroBrane Studio 进行各种断点调试。

关于 ZeroBrane Studio 远程调试更多的内容见此文档

0x01 Problems

在实践中,可能没有像 part 0x00 那么顺利,如果遇到以下问题,请逐一解决:

P1. 找不到 socket 库

LuaScriptException: [string "mobdebug.lua"]:101: module 'socket' not found:
    no field package.preload['socket']
    no file './socket.lua'
    no file '/usr/local/share/lua/5.1/socket.lua'
    no file '/usr/local/share/lua/5.1/socket/init.lua'
    no file '/usr/local/lib/lua/5.1/socket.lua'
    no file '/usr/local/lib/lua/5.1/socket/init.lua'
    no file './socket.so'
    no file '/usr/local/lib/lua/5.1/socket.so'
    no file '/usr/local/lib/lua/5.1/loadall.so'

使用 LuaRocks 安装 luasocket :

$ luarocks install luasocket

P2. luasocket 与 ulua 不兼容

LuaScriptException: error loading module 'socket.core' from file '/usr/local/lib/lua/5.1/socket/core.so':
    dlopen(/usr/local/lib/lua/5.1/socket/core.so, 2): no suitable image found.  Did find:
    /usr/local/lib/lua/5.1/socket/core.so: mach-o, but wrong architecture

由于处在 32bit 与 64bit 的过渡时期,ulua 对不同平台的兼容方案如下:

  • Windows / Android 使用 luajit 2.0.1 i386 arm7

  • Mac OSX / iOS 使用 lua 5.1 i386 x86_64 arm7 arm64

  • luajit 2.0 不支持 64bit 的 bytecode

  • luajit 2.1 还在开发中

  • luac 在 64bit 系统下编译的 bytecode 不能在 32bit 系统下使用,反过来也是

  • ulua 使用修改过的 i386 / x86_64 的 lua 实际上只能解析 32bit 的 bytecode

而在 64bit Mac OSX 下使用 luarocks 编译安装的 luasocket 默认是 x86_64 架构的,所以出现不兼容情况。

我们需要修改 luarocks 的编译和链接参数,增加 i386 构架的支持:

$ vi /usr/local/share/lua/5.1/luarocks/cfg.lua

找到 if detected.unix then 后面的 defaults.variables.CFLAGS 在参数中追加 -arch i386 -arch x86_64

if detected.unix then
    ...
    defaults.variables.CFLAGS = "-O2 -arch i386 -arch x86_64"
    ...

同上,找到 if detected.macosx then 后面的 defaults.variables.LD 在参数中追加 -arch i386 -arch x86_64

if detected.macosx then
    ...
    defaults.variables.LD = "export MACOSX_DEPLOYMENT_TARGET=10."..version.."; gcc -arch i386 -arch x86_64"
    ...

保存 cfg.lua 后重新安装 luasocket 即可:

$ luarocks install luasocket
本文使用的是 LuaRocks 2.2.2 ,其它版本的配置文件略有不同;
如果您使用的是 LuaRocks 2.0.x 请参考[此文](http://dualface.github.io/blog/2013/01/27/install-32bit-lua-on-macosx/)。