如何使用 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)完全终止执行。