详解关于Lua调试器代码实现

移动开发 iOS
关于Lua调试器代码实现是本文要介绍的内容,主要是来了解LUA调试器的使用,不多说,具体内容来看本文详解。

关于Lua调试器代码实现是本文要介绍的内容,主要是来了解LUA调试器的使用,不多说,具体内容来看本文详解。

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

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

从Decoda启动宿主程序

(1)project菜单中的Settings

(2)在commond中填入你要运行的宿主程序。点击ok

详解关于Lua调试器代码实现

(3)用它打开lua脚本设置断点。Decoda 中选择Start Debugging

下面是简单的例子。

  1. main.cpp  
  2.  
  3. #include <iostream> 
  4. #include "luaDebug.h"  
  5.  
  6. using namespace std;  
  7.  
  8. int main() startLuaDebug();  
  9. DebugFile("add.lua");  
  10. ParamData in[1];  
  11. ParamData out;  
  12. in[0].tt = PNUM; in[0].value.p = "HELLO: ";  
  13. out.tt = PNUM;  
  14.  
  15. DebugFunction("Hello",in,1,1,&out);  
  16.  
  17. stopLuaDebug();  
  18.  
  19. printf("%s\n",out.value.p);  
  20. system("pause");  
  21. return 0;  
  22. }  
  23.  
  24. luaDebug.h  
  25.  
  26. #ifndef LUA_DEBUG_H  
  27. #define LUA_DEBUG_H  
  28.  
  29. enum TT NIL,   // null  
  30. BNUM,   // boolean  
  31. CNUM,   // char  
  32. INUM,   // int  
  33. LNUM,   // long  
  34. FNUM,   // float | double  
  35. PNUM,   // char *  
  36. VNUM        // void *  
  37. };  
  38.  
  39. typedef union ParamValue bool b;  
  40. char c;  
  41. int i;  
  42. long l;  
  43. float f;  
  44. char *p;  
  45. void *v;  
  46. }ParamValue;  
  47.  
  48. typedef struct ParamData int tt;  
  49. ParamValue value;  
  50. }ParamData;  
  51.  
  52. int startLuaDebug();  
  53. void stopLuaDebug();  
  54. int DebugFile(char *filename);  
  55. void DebugFunction(char *funName,   
  56.        ParamData param[],   
  57.        int len,   
  58.        bool bret,  
  59.        ParamData *pRet  
  60.        );  
  61.  
  62. #endif  
  63.  
  64. luaDebug.cpp  
  65.  
  66. #include <stdio.h> 
  67. #include <iostream> 
  68. #include <stdlib.h> 
  69. #include "lua.hpp"  
  70. #include "luaDebug.h"  
  71.  
  72. lua_State *L;   
  73.  
  74. /*  
  75. * 开启lua虚拟机   
  76. * ret 1 => open vm error!  
  77. *     0 => open vm success! int startLuaDebug() L = lua_open();  
  78. if(L == NULL) return 1;  
  79. luaL_openlibs(L);  
  80. return 0;  
  81. }  
  82.  
  83. /*  
  84. * 关闭lua虚拟机 void stopLuaDebug() lua_close(L);  
  85. }  
  86.  
  87. /*  
  88. * funName 函数名称  
  89. * param[] 参数数组  
  90. * len     参数的长度  
  91. * bret    是否有返回结果  
  92. * pRet    返回的结果 void DebugFunction(char *funName,   
  93.        ParamData param[],   
  94.        int len,   
  95.        bool bret,  
  96.        ParamData *pRet {  
  97. if(NULL == L || funName == NULL) return;  
  98. lua_getglobal(L, funName);  
  99. for(int i = 0; i < len; i++) {  
  100.    switch(param[i].tt) {  
  101.     case BNUM:   
  102.      lua_pushboolean(L,param[i].value.b);    
  103.      break;  
  104.     case CNUM:   
  105.      lua_pushinteger(L,(int)param[i].value.c);   
  106.      break;  
  107.     case INUM:   
  108.      lua_pushinteger(L,param[i].value.i);    
  109.      break;  
  110.     case LNUM:   
  111.      lua_pushinteger(L,param[i].value.l);    
  112.      break;  
  113.     case FNUM:   
  114.      lua_pushnumber(L,param[i].value.f);    
  115.      break;  
  116.     case PNUM:       lua_pushstring(L,param[i].value.p);  
  117.       break;     case VNUM:       lua_pushlightuserdata(L,param[i].value.v);  
  118.       break;    }  
  119. } lua_call(L,len,(int)bret);  
  120. if(bret) {  
  121.    if(pRet != NULL) {  
  122.     // 为了便于扩展和应用这里不采用[ lua_type(L,lua_gettop(L)) ]而由参数指定类型  
  123.     switch(pRet->tt) {  
  124.      case BNUM: pRet->value.b = lua_toboolean(L,-1); break;  
  125.      case CNUM: pRet->value.c = (char)lua_tointeger(L,-1); break;  
  126.      case INUM: pRet->value.i = lua_tointeger(L,-1); break;  
  127.      case LNUM: pRet->value.l = lua_tointeger(L,-1); break;  
  128.      case FNUM: pRet->value.f = lua_tonumber(L,-1); break;  
  129.      case PNUM:        char *pRetTemp = (char *)malloc(strlen(lua_tostring(L,-1)) + 1);  
  130.        strcpy(pRetTemp,lua_tostring(L,-1));  
  131.        pRet->value.p = pRetTemp;   
  132.        break;      case VNUM: break; //这里留给具体要用时再去扩展。    }  
  133.  
  134.    lua_pop(L,1); }  
  135.  
  136. /*  
  137. * filename 文件名  
  138. * ret 1 => debug error!  
  139. *      0 => debug success! int DebugFile(char *filename) if(filename == NULL) return 1;  
  140. if(NULL == L) return 1;  
  141. return luaL_dofile(L,filename);  
  142. }     
  143.  
  144. add.lua  
  145.  
  146. function Hello(a)  
  147.     local c = a .. "yegui!";  
  148.     return c;  
  149. end  
  150.  
  151. local i = 3 
  152. local j = 4 
  153. local k = i + j  
  154. print(k); 

调试过程图

详解关于Lua调试器代码实现

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

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

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

详解关于Lua调试器代码实现

3、选择宿主程序Attach。

4、ok

小结:详解关于Lua调试器代码实现的内容介绍完了,希望通过本文的学习能对你有所帮助!

责任编辑:zhaolei 来源: 互联网
相关推荐

2011-08-31 16:47:07

Lua调试器

2011-08-24 16:41:38

lua调试器

2011-08-24 11:08:09

Lua

2011-08-31 16:51:12

Lua调试器

2011-08-25 16:34:27

Lua调试器

2009-12-14 10:57:34

Ruby调试器

2010-03-01 11:06:52

Python 调试器

2020-03-16 10:05:13

EmacsGUDLinux

2016-09-27 20:12:33

Android虚拟机Android动态调试

2011-08-24 15:28:02

Lua编译器解释器

2023-02-28 11:39:55

CMake脚本项目

2009-06-23 11:05:05

Mircosoft C

2011-08-25 10:07:24

Lua 5.0函数编译器

2010-02-24 09:32:24

Python 调试器

2022-05-23 09:22:20

Go语言调试器Delve

2023-03-13 00:21:21

调试器断点开发者

2011-08-25 14:03:32

UbuntuLUA安装

2011-08-24 14:33:14

LUA开发环境Decoda

2011-08-25 17:25:55

LUADelphi

2011-08-23 17:42:42

Lua脚本
点赞
收藏

51CTO技术栈公众号