u3d tolua + ZeroBraneStudio远程调试

《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脚本

将脚本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.cs

由于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)
{...}

防止zbs异常结束unity

在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; 

调试步骤

  1. 启动zbs,在左侧的project视图中,右键点击根目录,在弹出的右键菜单中,选择choose,选择你要调试的Lua代码目录。
  2. 然后在zbs中,打开目录中的任意一个lua代码文件,让zbs去匹配路径。
  3. 启动远程调试服务器:点击菜单Project,勾选Start Debugger Server
  4. 在你的代码需要调试的时候,加入启动代码require("mobdebug").start(ip, port),port可以缺省,使用zbs默认的端口。建议这一步,在你的程序中做一个调试界面,仅在需要调试的时候,打开这个界面,输入ip,点击确定的时候,去执行启动代码。
原文地址:https://www.cnblogs.com/ygxsk/p/7693972.html