Как продолжение Lua Explorer подумывал о возможности по настоящему дебагить исполняемый в среде Far скрипт.
Немного погуглив на эту тему пришел к выводу, что в принципе это дело можно осуществить двумя способами:
Способ 1:
Непосредственно из самого скрипта, используюя напр. debug.sethook(hookfunc, 'l').
В данном случае функция hookfunc вызывается перед выполнением каждой строки скрипта содержащей мин. один стэйтмент. В ней можно было бы имплементировать дальнейшую логику, которая бы собирала информацию о среде исполнения и показывала/передавала бы ее дальше.
В моем случае я напр. просто собирал информацию путем debug.getinfo / debug.getlocal, устанавливал в редакторе, если скрипт запущен из него, курсор на выполняемую строку (FarColorer -> Configure -> [X] Cross) и выдавал нужное мне с помощью msgbox(). Но такой подход так же еще не очень удобен, т.к. msgbox() вечно закрывает код и вообще диструктивно вмешивается в работу самого скрипта.
Кроме того такой подход связан с некоторыми неудобствами: А именно, для отладки, код приходится временно модифицировать:
-- myluascript.lua
require('dbg') -- импортируем библиотеку нашего дебагера
debug.sethook(dbg.line_hookfunc, 'l') -- регистрируем хук
-- BOF
<user code>
-- EOF
debug.sethook() -- удаляем хук, дабы не мешать выполнению других макросов и т.д.
Способ 2:
Непосредственно в плагине LuaMacro? Например добавив, помимо соответствующей логики естественно, новый модус к eval('@myluascript.lua', xxx), где xxx имеет соответствующее значение.
Например открывать отдельное окно за пределами самого фара, или вторую консоль? (возможно ли такое вообще?) Или же общаться посредствам стандартных интерфейсов, дабы не зависеть от конкретной оболочки?
Собственно способ №2 и хотел предложить.
Сам к сожалению, ввиду отсутствия времени, в ближайшем будущем не смогу этим заняться, посему в идеи...
Re: Lua debugger
Posted: Fri 08 Mar, 2013 19:17
by Shmuel
Сделать дебаггер - это очень серьёзный и долговременный проект. Расширением eval тут не обойтись. Чтобы не изобретать велосипед, следует сначала изучить существующие дебаггеры для Lua.
У меня сейчас на это тоже времени нет.
Re: Lua debugger
Posted: Sat 09 Mar, 2013 00:32
by EGez
Сие было как небольшой анализ и результирующее оттуда предложение.
С тобой-то и так все ясно, с текущеми-то разработками. Я так полагаю сейчас и смысла нет за него браться, пока все не уляжется. На будущее...
Re: Lua debugger
Posted: Sat 09 Mar, 2013 10:37
by John Doe
EGez wrote:В моем случае я напр. просто собирал информацию путем debug.getinfo / debug.getlocal, устанавливал в редакторе, если скрипт запущен из него, курсор на выполняемую строку (FarColorer -> Configure -> [X] Cross) и выдавал нужное мне с помощью msgbox().
Интересно было бы посмотреть.
Re: Lua debugger
Posted: Sun 10 Mar, 2013 15:45
by HaRT
Shmuel wrote:Сделать дебаггер - это очень серьёзный и долговременный проект. [...] Чтобы не изобретать велосипед, следует сначала изучить существующие дебаггеры для Lua.
Присоединяюсь.
Вроде опыт прикручивания скриптовых отладчиков есть в PowerShell FAR…
И попутно: есть ли сейчас возможность прицепиться к Lua-макросу, выполняющемуся в ФАРе, внешним отладчиком для Lua?
Если нет, насколько сложно добавить?
Re: Lua debugger
Posted: Sun 10 Mar, 2013 16:27
by Shmuel
HaRT wrote:И попутно: есть ли сейчас возможность прицепиться к Lua-макросу, выполняющемуся в ФАРе, внешним отладчиком для Lua?
Если нет, насколько сложно добавить?
Думаю, что такая возможность есть. Надо только найти время.
Желающим попробовать советую в первую очередь ознакомиться с программой ZeroBrane Studio, имеющей remote debugger.
Примечание модератора
Обсуждение ZeroBrane Studio выделено в отдельную тему
Re: Lua debugger
Posted: Fri 22 Mar, 2013 14:44
by EGez
John Doe wrote:
EGez wrote:В моем случае я напр. просто собирал информацию путем debug.getinfo / debug.getlocal, устанавливал в редакторе, если скрипт запущен из него, курсор на выполняемую строку (FarColorer -> Configure -> [X] Cross) и выдавал нужное мне с помощью msgbox().
Интересно было бы посмотреть.
Пардон, начал тему и пропал, у меня эта пара недель как из жизни выпала, работа...
Вот пример, модуль дебагера: (ESC = step in, OK = отпустить)
module(..., package.seeall)
local t = {
_VERSION = '1.0',
}
-- Собираем локальные переменные
local function getLocals()
local i = 1
local keys, vals = {}, {}
local str = '\n'
local n, v = true, nil
while n do
n, v = debug.getlocal(3, i)
if n then
vals[n] = v
table.insert(keys, n)
i = i + 1
end
end
table.sort(keys)
for _, k in ipairs(keys) do
str = str .. ('%-17s: %s\n'):format(tostring(k), tostring(vals[k]))
end
return str
end
t.short_src = nil
function t.line(evt, line)
local fi = debug.getinfo(2)
-- Останавливаемся только в нужном нам файле (не всегда срабатывает)
if t.short_src then
if t.short_src ~= fi.short_src then
return
end
else
t.short_src = fi.short_src
end
if fi and fi.name then
local info = ([[
event : %s
function name : %s
current line : %d
parameter num : %d
language : %s
Area : %s
]]
):format(evt, fi.name, line, fi.nparams, fi.what, Area.Current)
-- Если в редакторе, устанавливаем курсор на строку
if Area.Editor and Editor.FileName == t.short_src then
Editor.Pos(1, 1, tonumber(line))
end
info = info .. getLocals()
if 1 == msgbox('DEBUG', info, 0x20008) then
t.short_src = nil
debug.sethook()
end
end
end
_G.dbg = t
-- активируем дебаг
require('dbg')
debug.sethook(dbg.line, 'l')
-- начало самого скрипта
function test(left, right)
local tmp
tmp = left + right
return tmp
end
local a = 1
local b = 2
local c = 1 + 2
local tst = test(a, b)
msgbox(('%d + %d ='):format(a, b), tostring(c))
-- конец самого скрипта
-- отключаем дебаг
debug.sethook()
Кстати, предложеный способ от paulclinger и этот одного типа... ("Способ 1")
Macro {
area="Editor"; key="F9"; description="Run Lua script from editor"; action=function()
local fname = Editor.FileName
local state = Editor.State
if mf.fmatch(fname, '*.lua') == 1 then
if band(state, 0x1) > 0 then
-- Новый файл
Keys('ShiftF2')
exit()
elseif band(state, 0x8) > 0 then
-- Сохраним перед запуском
Keys('F2')
if not Area.Editor then
exit()
end
end
eval('@' .. fname)
end
end;
}
Удачи...
Re: Lua debugger
Posted: Fri 22 Mar, 2013 15:17
by John Doe
dbg.lua:50: bad argument #4 to 'format' (number expected, got nil)
P.S.
Что за поле nparams я так и не смог выгуглить
local fi = debug.getinfo(2)
...
...fi.nparams ...
Re: Lua debugger
Posted: Sun 24 Mar, 2013 02:13
by EGez
John Doe wrote:dbg.lua:50: bad argument #4 to 'format' (number expected, got nil)
P.S.
Что за поле nparams я так и не смог выгуглить [. . .]