移动平台下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