C++和Lua - 未保护错误(坏回调)?这怎么可能?

我正在使用LuaJIT的FFI功能,结果出现了非常奇怪的问题。这条语句返回了一个PANIC: Unprotected Error (bad callback)错误:

function idle(ms)
    myDLL.myDLL_idle(session, ms)
end

但是这个简单的print语句却可以解决这个问题。

function idle(ms)
    print("anything")
    myDLL.myDLL_idle(session, ms)
end

另一个非常奇怪的解决方法是在主函数中使用myDLL.myDLL_idle()。这怎么可能呢?我不能随便使用任何函数,只有printsleep的调用是可以保证有效的。

function idle(ms)
    myDLL.myDLL_idle(session, ms)
end

myDLL.myDLL_idle(session, ms) -- 正常工作
idle(ms) -- 不工作(除非idle()的第一行是print语句)

这只是在另一个函数中进行了相同的操作。如果我尝试将其放入一个函数方法中,打印信息可以解决问题,这使得问题变得更加奇怪。这是一个巨大的问题。

点赞
用户3677376
用户3677376

根据文档,如果FFI代码调用一个通过存储的回调函数回调到Lua的C函数,LuaJIT不允许对FFI调用进行JIT编译。在大多数情况下,LuaJIT会检测到这些调用并避免编译,但如果这样做不成功,它会用“bad callback”错误消息中止。额外的 printprint目前还未编译。)有所帮助,因为它阻止了JIT编译。

建议的解决方案(而不是调用print)是使用jit.off函数明确阻止FFI调用被JIT编译。

2014-09-19 15:42:27