[LUA]为什么我从C++读取lua会出现莫名其妙的错误?

dot99 2005-03-08 03:28:10
lua script里面大约有100+的变量
作为配置,使用lua api在程序中读取

有时候读取正确,但是有时候读取错误

任何使用lua api的地方都可能出错~

我确认程序以及脚本没有错误。

有谁对此有任何的看法?
...全文
427 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
dot99 2005-03-25
  • 打赏
  • 举报
回复
没问题了~~~~
xyzxyz1111 2005-03-23
  • 打赏
  • 举报
回复
lua_checkstack使用了之后就没有问题了吗?
dot99 2005-03-23
  • 打赏
  • 举报
回复
仔细阅读手册后
发现:

lua_checkstack

很受用~~

在以前版本的lua中,stacksize是通过lua_open(size)来设定的

5.0.2中,是通过lua_checkstack来增长

When you interact with Lua API, you are responsible for controlling stack overflow. The
function
int lua_checkstack (lua_State *L, int extra);
grows the stack size to top + extra elements; it returns false if it cannot grow the stack to that
size. This function never shrinks the stack; if the stack is already larger than the new size, it is left
unchanged.

谢谢各位回复
揭帖

dot99 2005-03-20
  • 打赏
  • 举报
回复
any more ideal
Smile_Tiger 2005-03-15
  • 打赏
  • 举报
回复
我觉得不可能lua本身的问题,估计还是你的堆栈操作出问题了,为什么不尝试使用luabind、tolua++这些东东呢,接口很方便啊.之所以出现这么多lua的wrapper,就是因为lua的编程接口太难使用了
dot99 2005-03-15
  • 打赏
  • 举报
回复
to 楼上
即使换成堆栈操作,也没办法~~~(完全按照手册)

luabind只能使用boost-1.30.0,我机器上的是1.32且用的也是1.32
所以,使用luabind有点不方便~所以自己封装了一个

tolua++还没试过~
dot99 2005-03-14
  • 打赏
  • 举报
回复
拆分script以后
有时候会断在lua_close上~
具体位置如下:
LUA_API void lua_close (lua_State *L) {
lua_lock(L);
L = G(L)->mainthread; /* only the main thread can be closed */
luaF_close(L, L->stack); /* close all upvalues for this thread */
luaC_separateudata(L); /* separate udata that have GC metamethods */
L->errfunc = 0; /* no error function during GC metamethods */
do { /* repeat until no more errors */
L->ci = L->base_ci;
L->base = L->top = L->ci->base;
L->nCcalls = 0;
} while (luaD_rawrunprotected(L, callallgcTM, NULL) != 0); //断在这里
lua_assert(G(L)->tmudata == NULL);
close_state(L);
}

大家用lua的时候,发生过这样的问题没有?是否lua本身的问题?
dot99 2005-03-14
  • 打赏
  • 举报
回复
我是直接封装了lua,类似luawrapper.
每次都是断在lua_statck的操作上~~

如果把一个脚本拆分成几个,那也不会出现这样的问题
因为我的脚本里面变量太多了,我在怀疑是否有什么限制

也许是lua的bug吧,但是我在lua wiki和maillist上没有找到相关的信息
xyzxyz1111 2005-03-10
  • 打赏
  • 举报
回复
我觉得很有可能是lua的一个bug,根据那段代码,应该是从一个hash表里取值,一个hash表,可能是定长的数组,然后每个项是一个链表,可能是某次操作的时候没有及时的把n清为NULL.这个我回去再查查,你也可以查查原代码.
Smile_Tiger 2005-03-10
  • 打赏
  • 举报
回复
你是直接使用lua的么?还是使用了lua wrapper的东东,比如luabind、tolua++等等

会不会是堆栈处理发生错误的原因?
dot99 2005-03-10
  • 打赏
  • 举报
回复
“错误不可能自己出现确无凭消失”

但是这个错误,现在确很少发生。。。(另外一个包含同样代码的测试程序却有问题)

还没确定是什么问题。。。。

n确实指向一个非法地址~不过,是怎么产生的呢?难道lua不稳定,时有时无(这个不可能阿,因为使用lua的东西很多)
dot99 2005-03-09
  • 打赏
  • 举报
回复
test_manyvarinscript.exe 中的 0x0042cc94 处未处理的异常: 0xC0000005: 读取位置 0x00001634 时发生访问冲突 。

最终断在
const TObject *luaH_getstr (Table *t, TString *key) {
Node *n = hashstr(t, key);
do { /* check whether `key' is somewhere in the chain */
if (ttisstring(gkey(n)) && tsvalue(gkey(n)) == key) //断在这里
return gval(n); /* that's it */
else n = n->next;
} while (n);
return &luaO_nilobject;
}

call stack是:

test_manyvarinscript.exe!luaH_getstr(Table * t=0x00376600, TString * key=0x00462300) 行459 + 0x3 C
test_manyvarinscript.exe!luaH_get(Table * t=0x00376600, const lua_TObject * key=0x00376610) 行472 + 0x10 C
test_manyvarinscript.exe!luaV_gettable(lua_State * L=0x00375ff0, const lua_TObject * t=0x00376030, lua_TObject * key=0x00376610, int loop=0) 行158 + 0xd C
> test_manyvarinscript.exe!lua_gettable(lua_State * L=0x00375ff0, int idx=-10001) 行488 + 0x19 C
test_manyvarinscript.exe!HDX::detail::luaScript_impl::scriptNumberType::getValue(lua_State * vm=0x00375ff0, const char * value_name=0x00450364) 行50 + 0x1e C++
test_manyvarinscript.exe!HDX::detail::script_vm_template<HDX::detail::luaScript_impl>::getValue<HDX::detail::luaScript_impl::scriptNumberType>() 行618 + 0xf C++
test_manyvarinscript.exe!HDX::detail::script_vm_template<HDX::detail::luaScript_impl>::getNumber(const char * value_name=0x00450364) 行624 C++
test_manyvarinscript.exe!testManyVarinScript::run() 行92 + 0xd C++


getNumber和其impl都正确(否则不可能前面读取正确,后面错误,而且有时候,没改变代码,错误地方不一样)

run()中的测试代码为:

//以上20+变量读取
script_.getNumber("pic_pass_pos_x2");
script_.getNumber("pic_pass_pos_y2"); //以上都正确
script_.getNumber("pic_pass_pos_x3"); //这里错误
//以下变量读取

且确定pic_pass_pos_x3存在于脚本(否则抛出异常)

script是对luaapi的一个封装



xyzxyz1111 2005-03-09
  • 打赏
  • 举报
回复

const TObject *luaH_getstr (Table *t, TString *key) {
Node *n = hashstr(t, key);
do { /* check whether `key' is somewhere in the chain */
if (ttisstring(gkey(n)) && tsvalue(gkey(n)) == key) //断在这里
return gval(n); /* that's it */
else n = n->next;
} while (n);
return &luaO_nilobject;
}

很可能n没有赋值导致地址读取错误
你看看发生错误的时候,n的值是多少? 是否是一个数据结构的指针?


fibbery 2005-03-08
  • 打赏
  • 举报
回复
lua是什么东西?有什么特征?
xyzxyz1111 2005-03-08
  • 打赏
  • 举报
回复
单步调试会吗?编译debug版本的lua会吗?
xyzxyz1111 2005-03-08
  • 打赏
  • 举报
回复
继续debug到lua 的代码里,看看最终的问题是什么。
dot99 2005-03-08
  • 打赏
  • 举报
回复
不管debug还是release都会出错(或者有时候正确)
debug是断在使用lua api的地方
有时候是
lua_pushstring(.....)
lua_gettable(....)

有时候是
lua_toxxxx

而且我确保数据类型正确

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧