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


  • 相关阅读:
    poj 3280 Cheapest Palindrome(区间DP)
    POJ 2392 Space Elevator(多重背包)
    HDU 1285 定比赛名次(拓扑排序)
    HDU 2680 Choose the best route(最短路)
    hdu 2899 Strange fuction (三分)
    HDU 4540 威威猫系列故事――打地鼠(DP)
    HDU 3485 Count 101(递推)
    POJ 1315 Don't Get Rooked(dfs)
    脱离eclipse,手动写一个servlet
    解析xml,几种方式
  • 原文地址:https://www.cnblogs.com/lancidie/p/1970954.html
Copyright © 2011-2022 走看看