Debugging 改进Lua错误消息
每当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解释器,请使用自己的函数替换
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