Отслеживание выполнения скриптов Lua

Я знаю, что вы можете использовать библиотеку отладки lua, чтобы получить некоторую информацию о трассировке / отладке. Но информация разбита по частям. Поэтому мне интересно, есть ли способ отследить выполнение сценария Lua. Пошаговый процесс. это будет необходимо, и он будет автоматически проходить на каждом этапе выполнения Составить отчет, например, следующим;

Called: function xyz  from : Table abc
It has n parameters
Param 1: apples
Param 2: oranges
.
.

It has m returns
return 1: red
return 2: yellow
.
.

Called: function xyz2  from : Table abc2
It has n parameters
Param 1: pears
Param 2: bananas
.
.
It has m reruns
return 1: heavy
return 2: light
.
.

and so on....
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
1
0
981
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот код, который раньше распространялся в архиве Lua. Он с 2005 года и до сих пор работает нормально.

-- trace calls
-- example: lua -ltrace-calls bisect.lua

local level=0

local function hook(event)
 local t=debug.getinfo(3)
 io.write(level," >>> ",string.rep(" ",level))
 if t~=nil and t.currentline>=0 then io.write(t.short_src,":",t.currentline," ") end
 t=debug.getinfo(2)
 if event= = "call" then
  level=level+1
 else
  level=level-1 if level<0 then level=0 end
 end
 if t.what= = "main" then
  if event= = "call" then
   io.write("begin ",t.short_src)
  else
   io.write("end ",t.short_src)
  end
 elseif t.what= = "Lua" then
  io.write(event," ",t.name or "(Lua)"," <",t.linedefined,":",t.short_src,">")
 else
 io.write(event," ",t.name or "(C)"," [",t.what,"] ")
 end
 io.write("\n")
end

debug.sethook(hook,"cr")
level=0

Это здорово, спасибо. Есть идеи, как фиксировать аргументы функции, возвращаемые значения и в какой таблице мы находимся в данный момент?

K Kay 21.11.2018 00:31

почему, если я добавлю что-нибудь, даже простой оператор печати, все развалится. Я поместил печать (t.name) после строки t = debug.getinfo (2), и вывод развалился. Я использую зеробрейн. Lua 5.1. Я пробовал везде заменить io.write на print, и это тоже все испортило. У меня нулевой опыт работы с io.write

K Kay 21.11.2018 08:25

@DaveKay, потому что print добавляет новую строку, а io.write - нет.

lhf 21.11.2018 11:13

@Ihf, тогда как отлаживать lua? встроен в движок C / C++. Когда у вас нет доступа к движку и невозможно выполнить удаленную отладку по разным причинам. Я имею в виду, конечно, не везде, где размещаются операторы печати (потому что это то, что я буквально делаю сейчас). Где-то должен быть какой-то скрипт трассировки, который может отслеживать выполнение скриптов lua и создавать отчет

K Kay 25.11.2018 03:38

Другие вопросы по теме