为了快速调试,在某个断点处从脚本启动REPL有时很有用。我发现我可以随时启动Torch REPL:
require "trepl"
repl()
这种方法的唯一问题是REPL没有看到来自调用块的任何局部变量。无法检查本地,REPL作为调试器并不是很有用。
是否可以启动可以访问局部变量的REPL?
免责声明:我找到了自己的(新手)解决方案来解决这个问题,但我总是愿意接受替代/建议。
答案 0 :(得分:2)
一种可能的解决方法是使用包装器,它在调用debug.getlocal
之前使用repl()
将调用范围的局部变量复制到全局范围:
require "trepl"
function debugRepl(restoreGlobals)
restoreGlobals = restoreGlobals or false
-- optionally make a shallow copy of _G
local oldG = {}
if restoreGlobals then
for k, v in pairs(_G) do
oldG[k] = v
end
end
-- copy upvalues to _G
local i = 1
local func = debug.getinfo(2, "f").func
while true do
local k, v = debug.getupvalue(func, i)
if k ~= nil then
_G[k] = v
else
break
end
i = i + 1
end
-- copy locals to _G
local i = 1
while true do
local k, v = debug.getlocal(2, i)
if k ~= nil then
_G[k] = v
else
break
end
i = i + 1
end
repl()
if restoreGlobals then
_G = oldG
end
end
注意(因为它没有在文档中提及,只能从source看到):在REPL中键入break
会将执行返回给脚本,而exit
(或 CTRL + D )完全终止执行。