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

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

function _errH(msg)

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

end

function _main()

  -- 引发某些随机错误
  print(a-2)

end

function main()

    xpcall(_main, errH)
end

main()

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

stack traceback:
    [string ""]:7428: 在函数'__sub'中
    [string ""]:7651: 在<[string ""]:7432>函数中
    [C]: 在函数'xpcall'
    [string ""]:7658: 在函数'main'中
    [string ""]:7928: 在主块中

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

有没有办法影响这些缺少的文本?我是否需要为函数命名以外还定义它们?为什么我看到在函数'__sub'中,但是不看到在函数'_main'中,例如?

点赞
用户5675002
用户5675002

那个[string ""]来自于你加载代码块到虚拟机时的方式。你没有在lua_dofile/lua_loadfile/lua_dostring/lua_loadstring的参数里提供文件名,或者只提供了一个空字符串。

而且请注意,string是Lua文件(代码块)的名称,而不是函数的名称。

2016-08-24 16:37:55
用户415823
用户415823

通常在加载时,您可以指定代码块名称。辅助函数使用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" 是在 调试信息中显示的代码块的名称。

名称前面的等号会更改回溯:

my_chunk:1: in main chunk

如果省略等号,则会显示:

[string "my_chunk"]:1: in main chunk
2016-08-24 22:10:06