如何使用 torch REPL 进行调试?
How can I use the torch REPL for debugging?
为了快速调试,有时在某个断点处从脚本启动 REPL 很有用。我发现我可以随时通过以下方式启动 Torch REPL:
require "trepl"
repl()
这种方法的唯一问题是 REPL 看不到来自调用块的任何局部变量。如果无法检查局部变量,REPL 作为调试器并不是真正有用。
是否可以启动一个可以访问局部变量的 REPL?
免责声明:我已经找到了我自己的(新手)解决这个问题的方法,但我总是对 alternatives/suggestions 持开放态度。
一种可能的解决方法是使用包装器,在调用 repl()
:
之前使用 debug.getlocal
将调用范围的局部变量复制到全局范围
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 returns 执行中键入 break
,而 exit
(或CTRL+D)完全终止执行。
为了快速调试,有时在某个断点处从脚本启动 REPL 很有用。我发现我可以随时通过以下方式启动 Torch REPL:
require "trepl"
repl()
这种方法的唯一问题是 REPL 看不到来自调用块的任何局部变量。如果无法检查局部变量,REPL 作为调试器并不是真正有用。
是否可以启动一个可以访问局部变量的 REPL?
免责声明:我已经找到了我自己的(新手)解决这个问题的方法,但我总是对 alternatives/suggestions 持开放态度。
一种可能的解决方法是使用包装器,在调用 repl()
:
debug.getlocal
将调用范围的局部变量复制到全局范围
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 returns 执行中键入 break
,而 exit
(或CTRL+D)完全终止执行。