如何使用割炬REPL进行调试?

时间:2015-10-11 18:31:35

标签: lua introspection torch

为了快速调试,在某个断点处从脚本启动REPL有时很有用。我发现我可以随时启动Torch REPL:

require "trepl"
repl()

这种方法的唯一问题是REPL没有看到来自调用块的任何局部变量。无法检查本地,REPL作为调试器并不是很有用。

是否可以启动可以访问局部变量的REPL?

免责声明:我找到了自己的(新手)解决方案来解决这个问题,但我总是愿意接受替代/建议。

1 个答案:

答案 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 )完全终止执行。