C++ 和 Lua - 不 protected 错误(错误的回调)?这怎么可能

标签 c++ c lua ffi luajit

我正在与 LuaJIT 的 FFI 合作,并且得到了非常奇怪的结果。这将返回PANIC:不 protected 错误(错误回调):

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

但是这个简单的打印已经解决了问题。

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

另一个极其奇怪的解决方案是在主函数内使用myDLL.myDLL_idle()。这怎么可能?如果我将调用放入函数中,我也不能执行任何任意函数,唯一保证工作的是打印和 sleep 。

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

myDLL.myDLL_idle(session, ms) -- works
idle(ms) -- doesn't work (unless first line of idle() is a print statement)

它在做同样的事情,但只是在另一个函数中。如果我尝试将其放入函数方法中,则打印修复它只会增加这的完全奇怪性。这是一个大问题。

最佳答案

根据the documentation ,如果 FFI 代码调用通过存储的回调回调到 Lua 的 C 函数,则 LuaJIT 不允许 FFI 调用进行 JIT 编译。在大多数情况下,LuaJIT 会检测到这些调用并避免编译,但如果没有检测到,它会中止并显示“错误回调”错误消息。额外的 print 有所帮助,因为它阻止了 JIT 编译(printnot compiled atm 。)。

建议的解决方案(而不是调用 print)是使用 jit.off 函数显式停止 FFI 调用进行 JIT 编译。

关于C++ 和 Lua - 不 protected 错误(错误的回调)?这怎么可能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25924755/

相关文章:

c++ - 未解析的外部符号 C++

lua - D: (Win32) lua_rawgeti() 推送 nil

ssl - NodeMCU Lua Websockets 安全不适用于 2.0 基线

c++ - 响应 EN_UPDATE 消息时避免递归

c++ - 尝试在 CAxWindow 中托管 WMP 时,IAxWinHostWindow CreateControl 返回 E_NOINTERFACE

c - 与 printf 一起使用时 C 中 char* 和 int* 之间的区别

c - memcpy/memset 等可以处理的最大缓冲区大小是多少?

c++ - 在char元素中交换半字节

loops - Lua 成对出现,顺序和它写的一样

c++ - while循环中的while循环,两个条件如何工作?