Debugging 改进Lua错误消息

Debugging 改进Lua错误消息,debugging,lua,Debugging,Lua,每当Lua脚本中发生错误时,我希望它将所有本地和全局变量的值写入屏幕/可选写入文件-除了通常的堆栈跟踪之外 我如何才能将其作为所有错误的默认行为?如果您使用的是标准Lua解释器,请使用自己的函数替换debug.traceback。如果要在程序中嵌入Lua,请在Lua\u pcall中使用回溯功能,更合适的解决方案是在整个代码中使用xpcall local function myerrhandler ( errobj ) print(debug.traceback()) for k

每当Lua脚本中发生错误时,我希望它将所有本地和全局变量的值写入屏幕/可选写入文件-除了通常的堆栈跟踪之外


我如何才能将其作为所有错误的默认行为?

如果您使用的是标准Lua解释器,请使用自己的函数替换
debug.traceback
。如果要在程序中嵌入Lua,请在
Lua\u pcall

中使用回溯功能,更合适的解决方案是在整个代码中使用xpcall

local function myerrhandler ( errobj )
    print(debug.traceback())
    for k,v in pairs(_G) do print("GLOBAL:" , k,v) end
    return false
end

xpcall( function ()
--Your code here
end , myerrhandler )

您的错误处理程序可能会被覆盖。如果您是从C调用Lua,要始终打印堆栈,可以连接到luaG\u errormsg函数

在lua中,写下:

local _HandlingError = 0
function _ErrorHandler ( errobj )
    if( _HandlingError == 0 ) then
        _HandlingError = 1
        local errStr = tostring(errobj) or ""
        if( type(errobj)=='table' ) then
          errStr = "Table: {" .. table.concat(errobj, ',') .. "}"
        end
        print("Error: \"" .. errStr .. "\"")
        --for k,v in pairs(_G) do print("GLOBAL:" , k,v) end
        if( type(errobj)=='thread' ) then
            print(debug.traceback(errobj))
        else
            print(debug.traceback('',2))
        end
        _HandlingError = 0
    end
    return false
end
然后在ldebug.c中,如果(L->errfunc!=0),则在之后添加到luaG\u errormsg

该模块执行您想要的操作,在堆栈跟踪的每个级别显示局部变量。它不会转储整个globals表,但这可能有点过头了

要使用Luarock进行安装,请使用

luarocks install stacktraceplus
然后在代码中执行以下操作:

local STP = require "StackTracePlus"
debug.traceback = STP.stacktrace

在Lua 5.1中,这将自动转换所有堆栈跟踪;对于Lua5.2代码,您需要按照其他答案中的建议,使用
xpcall
包装代码。

谢谢,我将尝试您的建议。与此相关,我在邮件列表中看到一些关于“pcall和coroutines不合拍”的引用。我确实使用协程,我应该使用coxpcall和copcall吗?
local STP = require "StackTracePlus"
debug.traceback = STP.stacktrace