Lua检查库-pcall丢失函数名
我已经开始使用luajit中的checks库作为RPC接口 但是RPC调用使用pcall,当传递错误的参数时,checks无法获取函数名 相反,它会抛出一条错误消息,如:Lua检查库-pcall丢失函数名,lua,luajit,Lua,Luajit,我已经开始使用luajit中的checks库作为RPC接口 但是RPC调用使用pcall,当传递错误的参数时,checks无法获取函数名 相反,它会抛出一条错误消息,如: bad argument #3 to (null) (number expected, got nil) 而不是 bad argument #3 to (foo) (number expected, got nil) 打开调试积垢 #if 1 /* Debugging cruft */ int i; for
bad argument #3 to (null) (number expected, got nil)
而不是
bad argument #3 to (foo) (number expected, got nil)
打开调试积垢
#if 1 /* Debugging cruft */
int i;
for(i=0;i<10;i++){
if( ! lua_getstack( L, i, & ar)) break;
lua_getinfo( L, "n", & ar);
printf( "\tat level %d: '%s' / '%s'\n", i, ar.name, ar.namewhat);
}
printf( "\tend of error, level was %d\n\n", level);
#endif
因此,调用了pcall,但函数名为null
我是否正确地认为,如果在第1级找到函数“pcall”而不是显示null,则需要从第2级替换pcall函数的第一个参数。但是我不懂LuaAPI。。。您将如何做到这一点?如您所见,Lua不知道该值的名称(作为第一个参数传递给
pcall
)的函数值),因此您在这里不能做任何事情。我不知道LuaJIT可以像Lua解释器那样提供完整的回溯。我可能错了。但请记住,LuaJIT正在将代码的某些部分编译为机器代码,这是一种跟踪JIT,这意味着它编译的内容不一定与原始函数有任何对应关系(例如,跟踪可能会跨越函数边界)。因此,如果LuaJIT能够提供一个有用的回溯,而它能够JIT很多代码,我会感到惊讶。我怀疑(null)在这里意味着它在JITed跟踪中。
at level 0: 'checks' / 'global'
at level 1: '(null)' / ''
at level 2: 'pcall' / 'global'
at level 3: 'Run' / 'local'
at level 4: '(null)' / ''
end of error, level was 1
false bad argument #3 to (null) (number expected, got nil)