Отладка lua-скриптов


>> Запуск интерактивного отладчика

debug.debug()

>> Получение отладочного хука для текущего потока

hook_func, hook_mask, hook_count  = debug.gethook([thread])

>> Установка отладочного хука

debug.sethook ([thread,] hook, mask [, count])

mask: c=call, r=return, l=line, c=count

>> Получение информации

tab = debug.getinfo ([thread,] stack_level [, what])

Значения what:

'n' - selects fields name and namewhat
'f' - selects field func
'S' - selects fields source, short_src, what, and linedefined
'l' - selects field currentline
'u' - selects field nup

Пример:

local info = debug.getinfo(level, "Sl")

Внутри таблицы есть поля:

- source
- short_src
- linedefined
- what ("main", "Lua", "C")
- name
- namewhat ("global", "local", "method", "field", "")
- nups
- func


-- return name of current function
debug.getinfo(1,"n").name

-- return table for print()
debug.getinfo(print)

>> Получение имени и значения переменной

name, value = debug.getlocal([thread,] stack_level, local_idx)

Пример: local name, value = debug.getlocal(1, a)

>> Обратная функция установки значения

debug.setlocal ([thread,] level, local, value)

>> Получение метатаблицы

tab debug.getmetatable(value)

>> Обратная функция - установка метатаблицы

debug.setmetatable(value, table)

>> Дополнительная функция установки одной строки метатаблицы

debug.setupvalue (f, up, value)

>> Получение таблицы регстров

debug.getregistry()

>> Получение значения userdata

debug.getuservalue(udata)

>> Обратная функция - установка userdata

debug.setuservalue(udata, value)

>> Получение трассировки

debug.traceback([thread,] [message [, level]])

>> Получение id usedate для значения с номером n внутри функции f

debug.upvalueid(f, n)

>> Связка n1 внутри closure f1 к n2 внутри f2 и т.д.

debug.upvaluejoin(f1, n1, f2, n2)


Пример функции трассировки всего стека вызовов:

function traceback()
  local level = 1
  while true do
    local info = debug.getinfo(level, "Sl")
    if not info then break end
    -- is a C function?
    if info.what == "C" then
      print(level, "C function")
    else -- a Lua function
      print(string.format("[%s]:%d", info.short_src, info.currentline))
    end
    level = level + 1
  end
end


Пример установки трассировки для каждой строки:

function trace (event, line)
  local s = debug.getinfo(2).short_src
  print(s .. ":" .. line)
end

debug.sethook(trace, "l")