移动平台下lua调试方法

听说vs有一个插件叫做vslua,可以在vs里单步lua程序,但是听试过的人说,只能对纯脚本。如果脚本里调用一个C函数,是无法从脚本代码单步到C语言代码,也无法从C语言代码单步到脚本代码。对于在MTK里构建一个lua虚拟器这种情况,也是无法单步脚本程序的。

MTK平台下使用LUA脚本语言的调试过程是很困难的,原因是lua脚本并没有真正意义上的编译(也即没有语法检查),也没有单步调试。以下是我这几个月的总结:

 

注意要点:

1.细心。Lua不会帮你检查你的函数名(变量名)是否写错了。

2.好的设计。每一种语言都要设计,但在这种调试困难的环境下,设计显得更加重要。设计不好,后面改起来更困难。

        

         如果lua程序运行出错了,调试办法如下:

         1。代码里打log(也就是写到文件),根据log的内容判断程序出错的地方。

 

         2。根据出错的现象来判断出错时调用了哪个函数,直接在函数里设置断点。例如:lua程序无法将文字显示在手机屏幕上,那么直接把断点打在gui_print_text_n语句上,看看xy还有str有没有错。

 

  1. int drawString(lua_State *L)
  2. {
  3. 。。。
  4.     unsigned short* str = (unsigned short*)(unsigned long)lua_tonumber(L, 2);
  5.     int x           = (int)lua_tonumber(L, 3);
  6.     int y           = (int)lua_tonumber(L, 4);
  7.     gui_set_text_color(。。。);
  8.     gui_move_text_cursor(x, y);
  9.     gui_print_text_n(str, len);
  10.  
  11.     return 0;
  12. }

 

       3lua_pcall返回非0时获取出错信息。测试C代码如下:

  1. #ifndef ARRAY_LEN
  2. #define ARRAY_LEN(array)    (sizeof(array)/sizeof(array[0]))
  3. #endif
  4. int test1(lua_State *l)
  5. {
  6.     return 0;
  7. }
  8. int test2(lua_State *l)
  9. {
  10.     return 0;
  11. }
  12. static const luaL_reg myLib[]=
  13. {
  14.     {"test1", test1},
  15.     {"test2",test2},
  16. };
  17. void my_openlibs(lua_State *l)
  18. {
  19.     int i = 0;
  20.     
  21.     for (i = 0; i < ARRAY_LEN(myLib); i++)
  22.     {       
  23.         lua_register(l, myLib[i].name, myLib[i].func); 
  24.     }
  25. }
  26. int main (int argc, char *argv[]) {
  27.     int status;
  28.     struct Smain s;
  29.     int ret;
  30.     lua_State *l = lua_open();  /* create state */
  31.     if (l == NULL) {
  32.         l_message(argv[0], "cannot create state: not enough memory");
  33.         return EXIT_FAILURE;
  34.     }
  35.     //luaL_openlibs(l);
  36.     my_openlibs(l);
  37.     luaL_loadfile(l, "test.lua");
  38.     if(lua_pcall(l, 0, -1, 0)!=0)
  39.     {
  40.         const char *str;
  41.         lua_pop(l,1);
  42.         str = lua_tostring(l, 0);
  43.         status = status;
  44.     }
  45.     lua_getglobal(l,"main");
  46.     //lua_pushnumber(L, param1);
  47.     //lua_pushnumber(L, param2);
  48.     if(lua_pcall(l, 0, 1, 0) != 0)
  49.     {
  50.         const char *str;
  51.         lua_pop(l,1);
  52.         str = lua_tostring(l, 0);
  53.         status = status;
  54.     }
  55.     return 1;
  56. }

脚本代码如下:

  1. function main()
  2.     test1()
  3.     test2()
  4.     test3()
  5.     return 1
  6. end

将断点设置在这一句:

         status = status;

如果lua正确运行,则不会跳到这个断点上;在某些情况下运行出错,就会到这里到。那么查看str的内容就知道出错信息。

在上面例子有两个lua_pcall,第一个读取文件内容,第二个执行lua脚本的main函数。如果运行“正常”的话,程序会停在第二个“status = status;”上。查看str内容,应该是这样的:

test.lua:7: attempt to call global `test3' (a nil value).

         实际上test3并没有定义,因此脚本就会报错。

你可能感兴趣的:(脚本,null,lua,语言,平台,MTK)