缺少Lua堆栈回溯中的函数名称

时间:2016-08-24 16:09:52

标签: debugging lua traceback

我正在尝试改进运行Lua脚本的程序中的错误处理。 简化版:

function _errH(msg)

    print(msg .. "\n" .. debug.traceback(nil, 1))

end

function _main()

  -- cause some random error
  print(a-2)

end

function main()

    xpcall(_main, errH)
end

main()

给我以下调用堆栈(请忽略错误的行号):

stack traceback:
    [string ""]:7428: in function '__sub'
    [string ""]:7651: in function <[string ""]:7432>
    [C]: in function 'xpcall'
    [string ""]:7658: in function 'main'
    [string ""]:7928: in main chunk

现在我想知道为什么到处都有[string ""]

有没有办法影响这些遗失的文本?除了定义函数之外,我还必须命名这些函数吗? 为什么我会看到in function '__sub'而不是in function '_main'

2 个答案:

答案 0 :(得分:3)

[string ""]来自您将块加载到vm中的方式。你没有提供filename作为lua_dofile / lua_loadfile / lua_dostring / lua_loadstring的参数,或者只是在那里给出了空字符串。
请注意,string是lua文件(lua chunk)的名称,而不是函数的名称。

答案 1 :(得分:2)

通常,您可以在loading时分配块名称。辅助函数使用lua_load,大多数将根据正在加载的内容类型设置块名称:

  • lua_load接受块名称
  • luaL_loadfile将使用文件名
  • luaL_dofile使用luaL_loadfile
  • luaL_loadstring将使用字符串内容
  • luaL_dostring使用luaL_loadstring
  • luaL_loadbuffer接受块名称

如果查看luaL_loadstring的源代码:

LUALIB_API int luaL_loadstring (lua_State *L, const char *s) {
  return luaL_loadbuffer(L, s, strlen(s), s);
}

请注意,它实际上只是一个使用字符串作为块名称调用luaL_loadbuffer的便捷函数。因此,需要从以下字符串加载代码:

luaL_loadbuffer(L, s, strlen(s), "=my_chunk");

"=my_chunk"debug information中显示的块名称。

名称前面的等号会改变追溯:

my_chunk:1: in main chunk

省略等号的地方将显示:

[string "my_chunk"]:1: in main chunk