zoukankan      html  css  js  c++  java
  • lua 调试器(Decoda)

    1、http://www.unknownworlds.com/decoda,这个工具可以注入到宿主程序内对lua脚本进行调试。

    2、有2种方式对lua进行调试

    从Decoda启动宿主程序

    a、project菜单中的Settings

    b、在commond中填入你要运行的宿主程序。点击ok

    c、用它打开lua脚本设置断点。Decoda 中选择Start Debugging

    下面是简单的例子。

    ======     main.cpp ==================

    #include <iostream>
    #include "luaDebug.h"

    using namespace std;


    int main()
    {
    startLuaDebug();
    DebugFile("add.lua");
    ParamData in[1];
    ParamData out;
    in[0].tt = PNUM; in[0].value.p = "HELLO: ";
    out.tt = PNUM;

    DebugFunction("Hello",in,1,1,&out);

    stopLuaDebug();

    printf("%s\n",out.value.p);
    system("pause");
    return 0;
    }

    ======== luaDebug.h ===========

    #ifndef LUA_DEBUG_H
    #define LUA_DEBUG_H

    enum TT
    {
    NIL,   // null
    BNUM,   // boolean
    CNUM,   // char
    INUM,   // int
    LNUM,   // long
    FNUM,   // float | double
    PNUM,   // char *
    VNUM        // void *
    };

    typedef union ParamValue
    {
    bool b;
    char c;
    int i;
    long l;
    float f;
    char *p;
    void *v;
    }ParamValue;

    typedef struct ParamData
    {
    int tt;
    ParamValue value;
    }ParamData;

    int startLuaDebug();
    void stopLuaDebug();
    int DebugFile(char *filename);
    void DebugFunction(char *funName,
           ParamData param[],
           int len,
           bool bret,
           ParamData *pRet
           );

    #endif

    ===========   luaDebug.cpp ============

    #include <stdio.h>
    #include <iostream>
    #include <stdlib.h>
    #include "lua.hpp"
    #include "luaDebug.h"

    lua_State *L;

    /*
    * 开启lua虚拟机
    * ret 1 => open vm error!
    *     0 => open vm success!
    */
    int startLuaDebug()
    {
    L = lua_open();
    if(L == NULL) return 1;
    luaL_openlibs(L);
    return 0;
    }

    /*
    * 关闭lua虚拟机
    */
    void stopLuaDebug()
    {
    lua_close(L);
    }

    /*
    * funName 函数名称
    * param[] 参数数组
    * len     参数的长度
    * bret    是否有返回结果
    * pRet    返回的结果
    */
    void DebugFunction(char *funName,
           ParamData param[],
           int len,
           bool bret,
           ParamData *pRet
          )
    {
    if(NULL == L || funName == NULL) return;
    lua_getglobal(L, funName);
    for(int i = 0; i < len; i++) {
       switch(param[i].tt) {
        case BNUM:
         lua_pushboolean(L,param[i].value.b);  
         break;
        case CNUM:
         lua_pushinteger(L,(int)param[i].value.c);
         break;
        case INUM:
         lua_pushinteger(L,param[i].value.i);  
         break;
        case LNUM:
         lua_pushinteger(L,param[i].value.l);  
         break;
        case FNUM:
         lua_pushnumber(L,param[i].value.f);  
         break;
        case PNUM:
         {
          lua_pushstring(L,param[i].value.p);
          break;
         }
        case VNUM:
         {
          lua_pushlightuserdata(L,param[i].value.v);
          break;
         }  
       }
    }

    lua_call(L,len,(int)bret);
    if(bret) {
       if(pRet != NULL) {
        // 为了便于扩展和应用这里不采用[ lua_type(L,lua_gettop(L)) ]而由参数指定类型
        switch(pRet->tt) {
         case BNUM: pRet->value.b = lua_toboolean(L,-1); break;
         case CNUM: pRet->value.c = (char)lua_tointeger(L,-1); break;
         case INUM: pRet->value.i = lua_tointeger(L,-1); break;
         case LNUM: pRet->value.l = lua_tointeger(L,-1); break;
         case FNUM: pRet->value.f = lua_tonumber(L,-1); break;
         case PNUM:
          {
           char *pRetTemp = (char *)malloc(strlen(lua_tostring(L,-1)) + 1);
           strcpy(pRetTemp,lua_tostring(L,-1));
           pRet->value.p = pRetTemp;
           break;
          }
         case VNUM: break; //这里留给具体要用时再去扩展。
        }
       }

       lua_pop(L,1);
    }
    }

    /*
    * filename 文件名
    * ret 1 => debug error!
    *      0 => debug success!
    */
    int DebugFile(char *filename)
    {
    if(filename == NULL) return 1;
    if(NULL == L) return 1;
    return luaL_dofile(L,filename);
    }  

    ================== add.lua =========

    function Hello(a)
        local c = a .. "yegui!";
        return c;
    end

    local i = 3
    local j = 4
    local k = i + j
    print(k);

    ================调试过程图====================


    Decoda注入宿主程序的调试方法

    1、在宿主程序中放入getch()等暂停操作(貌似不能用设置断点的方式,否则Decoda将会异常。为什么会这样有待进一步学习),运行宿主程序

    2、选择decoda debug菜单。中的Processes选项。

    3、选择宿主程序Attach。

    4、ok


  • 相关阅读:
    Silverlight应用小知识点
    svn如何给新文件加锁
    sql统计上周销售量的起止时间
    sql中null 和 ‘’(空字符串)
    蓝桥杯 算法训练 操作格子 [ 线段树 ]
    90分 蓝桥杯 算法提高 道路和航路 [ 最短路 ]
    蓝桥杯 算法训练 安慰奶牛 [ 最小生成树 ]
    蓝桥杯 算法提高 金属采集 [ 树形dp 经典 ]
    转 蓝桥杯 历届试题 大臣的旅费 [ dfs 树的直径 ]
    蓝桥杯 算法训练 最短路 [ 最短路 bellman ]
  • 原文地址:https://www.cnblogs.com/lancidie/p/1970954.html
Copyright © 2011-2022 走看看