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

Debugging Lua堆栈回溯中缺少函数名,debugging,lua,traceback,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() 给我以下调用堆栈(请忽略错误的行号): 堆栈回

我正在尝试改进运行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()
给我以下调用堆栈(请忽略错误的行号):

堆栈回溯:
[字符串“”]:7428:在函数“\uu sub”中
[字符串“”]:7651:在函数中
[C] :在函数“xpcall”中
[字符串“”]:7658:在函数“main”中
[字符串“”]:7928:在主块中
现在我想知道为什么到处都是
[string”“]

有没有办法影响这些缺失的文本?除了定义函数外,我还必须命名函数吗?
例如,为什么我在函数“\uuu sub”中看到
而不是在函数“\u main”中看到

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

通常,您可以在需要时指定chunk名称。辅助功能使用
lua\u load
,大多数会根据加载的内容类型设置区块名称:

  • lua\u load
    接受块名称
  • luaL_loadfile
    将使用文件名
  • luaL\u-dofile
    使用
    luaL\u-loadfile
  • luaL\u loadstring
    将使用字符串内容
  • luaL\u-dostring
    使用
    luaL\u-loadstring
  • luaL\u loadbuffer
    接受块名
如果您查看以下内容的源代码:

注意,它实际上只是一个方便的函数,用字符串作为块名调用
luaL\u loadbuffer
。因此,需要从以下字符串加载代码:

luaL_loadbuffer(L, s, strlen(s), "=my_chunk");
其中,
“=my_chunk”
是将出现在中的块的名称

名称前的等号将更改回溯:

my_chunk:1: in main chunk
其中省略等号将显示:

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