Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua检查库-pcall丢失函数名_Lua_Luajit - Fatal编程技术网

Lua检查库-pcall丢失函数名

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

我已经开始使用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(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)