移动平台下lua调试方法

来源:互联网 发布:河鱼软件要钱吗 编辑:程序博客网 时间:2024/05/10 02:19

  移动平台下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语句上,看看x,y还有str有没有错。

 

int drawString(lua_State *L)
{
。。。
    unsigned short* str = (unsigned short*)(unsigned long)lua_tonumber(L, 2);
    int x           = (int)lua_tonumber(L, 3);
    int y           = (int)lua_tonumber(L, 4);

    gui_set_text_color(。。。);
    gui_move_text_cursor(x, y);
    gui_print_text_n(str, len);
 
    return 0;
}

 

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

 

#ifndef ARRAY_LEN
#define ARRAY_LEN(array)    (sizeof(array)/sizeof(array[0]))
#endif
int test1(lua_State *l)
{
    return 0;
}
int test2(lua_State *l)
{
    return 0;
}
static const luaL_reg myLib[]=
{
    {"test1", test1},
    {"test2",test2},
};
void my_openlibs(lua_State *l)
{
    int i = 0;
   
    for (i = 0; i < ARRAY_LEN(myLib); i++)
    {      
        lua_register(l, myLib[i].name, myLib[i].func);
    }
}

int main (int argc, char *argv[]) {
    int status;
    struct Smain s;
    int ret;
    lua_State *l = lua_open();  /* create state */
    if (l == NULL) {
        l_message(argv[0], "cannot create state: not enough memory");
        return EXIT_FAILURE;
    }
    //luaL_openlibs(l);
    my_openlibs(l);

    luaL_loadfile(l, "test.lua");
    if(lua_pcall(l, 0, -1, 0)!=0)
    {
        const char *str;
        lua_pop(l,1);
        str = lua_tostring(l, 0);
        status = status;
    }
    lua_getglobal(l,"main");
    //lua_pushnumber(L, param1);
    //lua_pushnumber(L, param2);
    if(lua_pcall(l, 0, 1, 0) != 0)
    {
        const char *str;
        lua_pop(l,1);
        str = lua_tostring(l, 0);
        status = status;
    }
    return 1;
}


脚本代码如下:


function main()
    test1()
    test2()
    test3()
    return 1
end

将断点设置在这一句:

         status = status;

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

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

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

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

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wuyao721/archive/2008/10/24/3137525.aspx

原创粉丝点击