lua 调试器(Decoda)

摘要:
单击okc并使用它打开lua脚本以设置断点。选择“在解码中启动调试”。以下是一个简单的示例=====main.cpp===============#include#include“luaDebug.h”usingspacestd;intmain(){startLuaDebug();DebugFile;ParamDatain[1];ParamDataout;in[0]。tt=PNUM;in[0].value.p=“HELLO:”;out。tt=PNUM;DebugFunction;stopLuaDebug();printf;system;return0;}==========luaDebug.h===========#ifndefLUA_DEBUG_h#defineLUA_DEBOG_HenumTT{NIL,//nullBNUM,//booleanCNUM,//charINUM,//intLNUM,//longFNUM,//floot|doublePNUM,//char*VNUM//void*};typedefinionParamValue{boolb;charc;inti;longl;floatf;char*p;void*v;}ParamValue;typedefstructParamData{inttt;ParamValuevalue;}ParamData;intstartLuaDebug();voidstopLuaDebug();intDebugFile;voidDebugFunction;#endif===============luaDebug.cpp===========#include#include#include#include“lua.hpp”#include“luaDebug.h”lua_State*L;/**启用lua虚拟机*ret1=˃openvmerror*/IntstartLuaDebug(){L=lua_open();ifreturn1;luaL_openlibs;return0;}/**关闭lua虚拟计算机*/void stopLuaDebugg(){lua_Close;}/*funName函数名*param[]参数数组*len参数长度*Bret是否存在返回结果*pRet返回结果*/void DebugFunction{ifreturn;lua_getglobal;for{switch{caseBNUM:lua_shboolean;break;caseCNUM:lua_shinter;break,caseINUM:lu7_shinter,break;case LNUM:lua_chinter;break;caseFNUM:lua-pushnumber;break;如果{If(pRet!=NULL){//为了便于扩展和应用,此处不使用[lua_type],并且类型由参数开关指定{caseBNUM:pRet-˃值。b=lua_toolean;break;caseCNUM:pRet-˃值。c=lua_tointer;break。caseINUM:pRet-˃值。i=lua_tonter;break;caseLNUM:pRetr-˃值。l=lua_toenter;break:;caseFNUM:pRet-˃值;f=lua_tontonton;break这是为了在需要时进行扩展而保留的。

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

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

从Decoda启动宿主程序

a、project菜单中的Settings

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

lua 调试器(Decoda)第1张

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

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

lua 调试器(Decoda)第2张

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

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

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

lua 调试器(Decoda)第3张

3、选择宿主程序Attach。

4、ok


免责声明:文章转载自《lua 调试器(Decoda)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Polya urn model (Polya 罐子模型) [转]Linux基础知识:文件权限管理以及umask下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

RabbitMQ安装与配置

ERLang环境配置 1.首先安装一个ERLang的支持库:以下两个选择执行一个就行 ●apt-get -y install libncurses5-dev ●apt-get -y install make g++ gcc libpcre3 libpcrecpp* libpcre3-dev libssl-dev autoconf automake libt...

CSS3(七) 前端预处理技术(Less、Sass、CoffeeScript)

目录 一、Less 1.1、概要 1.2、变量 1.3、解析Less 1.3.1、在线处理 1.3.2、预处理 1.4、混入(Mixins) 1.5、嵌套    1.6、运算 1.7、函数 1.8、继承     1.9、作用域 1.10、注释 二、Sass 2.1、变量 2.2、嵌套 2.3、导入 2.4、mixin 混入 2.5、扩展/继承...

9个最佳的大数据处理编程语言(转载自物联网智库)

大数据的浪潮仍在继续。它渗透到了几乎所有的行业,信息像洪水一样地席卷企业,使得软件越发庞然大物,比如Excel看上去就变得越来越笨拙。数据处理不再无足轻重,并且对精密分析和强大又实时处理的需要变得前所未有的巨大。 刚开始学习数据科学的人都会面对同一个问题: 不知道该先学习哪种编程语言。 不仅仅是编程语言,像Tableau,SPSS等软件系统也是同样的情况...

SpringBoot通过RedisTemplate执行Lua脚本的方法步骤

参考: https://www.jb51.net/article/212010.htm https://www.jb51.net/article/179946.htm https://www.jianshu.com/p/76bc0e963172 https://www.letianbiji.com/redis/redis-lua.html https://...

redis-缓存设计-记录前一个小时和最新的日志

需求 记录最新的日志 99条 同时记录上一个小时和最近一个小时的 日志出现次数 记录日志代码 /** * * @param conn 连接 * @param name 模块名字 * @param message 日志信息 * @param level 日志等级 * @param timeout...

c语言处理通过ajax发起http的post请求CGI并向浏览器返会值

环境:centos 6.5 web容器:apache2.4,[<http://httpd.apache.org/docs/2.4/] 准备: cd /usr/local/httpd-2.4.20/modules/generators enter   cp mod_cgi.c /usr/local/apache/bin enter   ....