《u3d tolua + ZeroBraneStudio远程调试》
作者:游蓝海
文章地址:http://blog.csdn.net/you_lan_hai/article/details/55057720
转载请注明出处
tolua默认支持ZeroBraneSudio(以下简称zbs)的本地调试,但不能进行远程调试。
其实远程调试也很简单,只需要将zbs的mobdebug.lua
脚本拷贝到你的工程Lua目录下,在需要调试的地方,执行代码require("mobdebug").start(ip, port)
即可连接到zbs进行调试。
但是,还需要一些配置,才能完美的进行下去。
将脚本mobdebug.lua
拷贝到你的工程Lua目录下。这个脚本位于zbs的安装目录下,如:mac系统路径 /Applications/ZeroBraneStudio.app/Contents/ZeroBraneStudio/lualibs/mobdebug/mobdebug.lua
为了能支持tolua,显示出函数堆栈,还需要修改几行代码,大概在178行附近,修改后如下:
if type(mt) == 'table' and (rawget(mt, "__serialize") or rawget(mt, "__tostring")) then -- knows how to serialize itself
seen[t] = insref or spath
if rawget(mt, "__serialize") then t = mt.__serialize(t) else t = tostring(t) end
ttype = type(t) end -- new value falls through to be serialized
因为tolua对“类”做了限制,如果访问一个不存在的属性时,会抛出异常。zbs需要知道__serialize
和__tostring
属性是否存在,直接调用mt.__serialize
会触发异常,导致堆栈解析失败。因此,这里统一使用rawget
函数去判断属性是否存在。
由于tolua加载lua脚本的时候,未记录文件后缀名,导致zbs无法定位原始文件。(其实这一步,修改mobdebug.lua
也可以,只是我没有找到地方,所以要修改c#,注:应该是修改过debugger_loop
)。在ToLua.csstatic int Loader(IntPtr L)
函数中,追加上文件后缀名。
if(!fileName.EndsWith(".lua"))
{
fileName += ".lua"; // 加上后缀名
}
if (LuaDLL.luaL_loadbuffer(L, buffer, buffer.Length, fileName) != 0)
{...}
在unity编辑器模式下开启调试,当点击结束调试的时候,zbs会调用lua的os.exit
函数,这个函数位于c语言中,掉用了系统函数,直接结束了unity的整个进程,而不是结束当前“程序”的运行,这个体验有点糟糕。
所幸,我们可以覆盖os.exit
,这也是脚本语言的优势,任何属性都可以动态的改掉。只需要在lua脚本开始执行的时候,加上下面的代码:
os.exit = function()
UnityEngine.Application.Quit()
end
我们使用了嵌入mobdebug的模式,所以就可以关闭掉tolua默认的调试模式,在LuaConst.cs中,关闭默认的调试模式:
public static bool openLuaSocket = true; // socket库必须要打开
public static bool openZbsDebugger = false;
choose
,选择你要调试的Lua代码目录。Project
,勾选Start Debugger Server
。require("mobdebug").start(ip, port)
,port可以缺省,使用zbs默认的端口。建议这一步,在你的程序中做一个调试界面,仅在需要调试的时候,打开这个界面,输入ip,点击确定的时候,去执行启动代码。