Lua创建新状态时崩溃

我正在使用256KB RAM和1MB Flash的Cortex-M4F嵌入式系统上工作。我的应用程序是用C++编写的,但我使用GCC构建并集成了Lua作为C库。我只需要将l_signalT定义为无符号32位整数。我的测试代码如下:

#include "lua.hpp"

int main(void)
{
    while (true)
    {
      lua_State * L = luaL_newstate();
      luaL_dostring(L, "a = 10 + 5");
      lua_getglobal(L, "a");
      int i = lua_tointeger(L, -1);
      printf("%d\n", i);
      lua_close(L);
    }
}

我遇到了空指针解引用的问题。增加堆栈大小并未解决这个问题。另外,在分配器中添加了对空的测试调用realloc。在setjmp/longjump代码中似乎发生了一些事情。我想知道是否有关于如何进一步调试这个问题的想法。我添加了一些用<-----注释的内容,可能需要滚动查看。这是我的堆栈转储。

static void setnodevector (lua_State *L, Table *t, unsigned int size) {
  if (size == 0) {  /* 没有元素来哈希部分?*/
    t->node = cast(Node *, dummynode);  /* 使用常见的“dummynode”*/
    t->lsizenode = 0;                                                      <---- t为零。写入数值是恶意的。
                                                                                 硬件故障。

static void auxsetnode (lua_State *L, void *ud) {
  AuxsetnodeT *asn = cast(AuxsetnodeT *, ud);
  setnodevector(L, asn->t, asn->nhsize);           <--- 最后两个值指向零。
}

<setjmp>
    466A        mov r2, sp
    E8A05FF4    stm r0!, {r2, r4-r12, lr}
    EC808B10    vstmia r0, {d8-d15}          <------ 下面调用LUAI_TRY的部分。在这里清除了ud的内存位置。
    2000        movs r0, #0                          
    4770        bx lr

int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) {
  unsigned short oldnCcalls = L->nCcalls;
  struct lua_longjmp lj;
  lj.status = LUA_OK;
  lj.previous = L->errorJmp;  /* 链接新错误处理程序 */
 L->errorJmp = &lj;
  LUAI_TRY(L, &lj,                                            <---- ud指向的值为非零,但在setjmp中被清除。
    (*f)(L, ud);
  );
  L->errorJmp = lj.previous;  /* 恢复旧的错误处理程序 */
  L->nCcalls = oldnCcalls;
  return lj.status;
}
点赞
用户873389
用户873389

我没有为 VFP 定义宏,导致 jmp_buf 的大小错误:

#if defined(__ARM_ARCH_VFP__) || defined(__ARM_ARCH_VFP3_D16__) ||
defined(__ARM_ARCH_VFP3_D32__) || defined(__ARM_ARCH_VFPV4_D16__) ||
defined(__ARM_ARCH_FPV4_SP_D16__) || defined(__ARM_ARCH_FPV5_SP_D16__) ||
defined(__ARM_ARCH_FPV5_D16__)
typedef unsigned long long jmp_buf[14];  // R4-R14, D8-D15
#else
typedef unsigned long jmp_buf[11];  // R4-R14
#endif

现在 Lua 正确计算和打印 10 + 5

enter image description here

2019-01-25 01:42:23