lua_pcall错误信息丢失

我正在使用lua_pcall调用一些函数,并希望捕获错误。 在某些情况下,错误似乎丢失了。为什么会发生这种情况呢? 这适用于使用错误处理程序和不使用错误处理程序的两种情况。在两种情况下,堆栈的顶部都不是字符串。

C 代码:

  lua_getglobal(L, "debug");
  lua_getfield(L, -1, "traceback");
  lua_replace(L, -2);
  lua_rawgeti(L, LUA_REGISTRYINDEX, my_func_index);
  // 现在在堆栈上推入 n_in 个值
  luaT_stackdump(L);
  int pcall_ret = lua_pcall(L, n_in, n_out, -n_in - 2);
  // lua_pcall 将从堆栈中消耗 n_in+1 个值。
  if(pcall_ret != 0) {
    const char* errmsg = lua_tostring(L, -1);
    if(!errmsg) {
      errmsg = "(没有 Lua 错误消息。)";
      printf("意外的 Lua 堆栈:\n");
      luaT_stackdump(L);
    }
    printf("Lua 错误代码 %i: %s\n", pcall_ret, errmsg);
    lua_pop(L, 2);  // 从堆栈中删除错误和 debug.traceback
    return ...;
  }
  // 现在在堆栈上有 n_out 个值

被调用的 Lua 函数看起来像这样(用于测试):

    function (x, W, b, index)
        print "来自 Lua func 的问候"
        A = torch.rand(15, 12)
        B = torch.rand(12, 23)
        C = torch.dot(A, B)
    end

当调用 torch.dot 时,它会出现错误。 但我不太清楚为什么。我没有得到任何有意义的错误信息。 这就是我的问题所在。

输出结果:

  1. Lua 对象类型:函数
  2. Lua 对象类型:函数
  3. userdata 4165a368 [torch.FloatTensor]
  4. userdata 4165a390 [torch.FloatTensor]
  5. userdata 4165a230 [torch.FloatTensor]
  6. userdata 4165a258 [torch.CharTensor]
---------------------------------------------
来自 Lua func 的问候
意外的 Lua 堆栈:
  1. Lua 对象类型:函数
  2. userdata 40ea1230 [torch.DoubleTensor]
---------------------------------------------
Lua 错误代码 2: (没有 Lua 错误消息。)

或许我的代码是正确的,这里真的应该返回错误字符串吗?所以也许调用 torch.dot 时存在一些内存损坏,即某些东西被弄乱了?

点赞
用户133374
用户133374

似乎需要调用torch.updateerrorhandlers()。然后我得到了一些有意义的输出:

来自Lua函数的问候
Lua错误代码2:在/tmp/luarocks_torch-scm-1-1092/torch7/lib/TH/generic/THTensorMath.c:384处不一致的张量大小
堆栈回溯:
        [C]:在0x7f63cd831360处
        [C]:在函数“点”中
        [字符串“返回…”]:9:在函数中< [字符串“返回…”]:2>

但是只有在Lua函数内部使用torch.updateerrorhandlers()才有效。

我尝试使用以下C代码,但没有效果:

    lua_getglobal(L,“torch”);
    lua_getfield(L,-1,“updateerrorhandlers”);
    lua_replace(L,-2);
    assert(lua_pcall(L,000)== 0);

我发现,在实际的my_func_index lua_pcall之前再次使用torch.updateerrorhandlers()调用,它就会起作用。 这是意外的,但也许这是因为这可能是另一个线程 (这是我所料料想的)。 实际上,我在Torch代码中发现了torch.updatethreadlocals()函数,它恰好是为此目的而存在的,现在我正在调用另一个lua_pcall之前的这一个:

    lua_getglobal(L,“torch”);
    lua_getfield(L,-1,“updatethreadlocals”);
    lua_replace(L,-2);
    assert(lua_pcall(L,000)== 0);

现在它有效了。

2016-03-16 15:04:03