zoukankan      html  css  js  c++  java
  • 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,点击确定的时候,去执行启动代码。
  • 相关阅读:
    xcode 定义自己的代码片段
    iOS 开发技巧
    iOS 上传自己的库到cocoapod
    制作正式版10.11 OS X El Capitan 安装U盘(优盘)
    查看 共享内存 的命令 ipcrm、ipcs
    批量kill 进程
    GROUP BY、HAVING、AS 的用法小例子
    C++多线程中调用python api函数
    C++ 查询某个变量的类型
    C++ 把枚举变量的名称,直接当字符串使用方法 字符串化符号 #
  • 原文地址:https://www.cnblogs.com/ygxsk/p/7693972.html
Copyright © 2011-2022 走看看