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