Debug function name

Страницы: 1
RSS
Debug function name
 
В версии 8.8 наблюдаю странную вещь.

в одних местах скрипта debug.getinfo(1) выдает таблицу , в которой есть поле name,

а других местах в получаемой таблице этого поля нет. Остальные поля вроде на месте.

вызов идёт из луа, си функций в последовательности вызова нет.

что может быть тому причиной?
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Анонимная функция
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Старатель написал:
Анонимная функция
Нет. Анонимные функции помечаются явным образом, это видно.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Предположу, что в одних местах функция вызвана "посередине", а в других происходит tail call, в этом случае уровень 1 заглядывает на функцию выше и, соответственно, локальных имен вызывающей функции не видит.
 
Цитата
Anton написал:
Предположу, что в одних местах функция вызвана "посередине", а в других происходит tail call, в этом случае уровень 1 заглядывает на функцию выше и, соответственно, локальных имен вызывающей функции не видит.
ничего не понял. Посередине - это как? Между левой и правой штаниной?))
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Цитата
s_mike@rambler.ru написал:
это как?
Это не tail call, обычный вызов функции.
 
Однако, все украдено до нас.
 
Цитата
Anton написал:
Цитата
   s_mike@rambler.ru написал:
это как?
Это не tail call, обычный вызов
Антон, tail call обязательно фигурирует в списке вложенности. Вы это можете легко проверить.

речь идёт не о стеке вызовов, тут все правильно. Речь идёт о том, что в getinfo по функции иногда не фигурирует ее название. Хотя вся остальная информация верна, трассировка вызовов правильная.

в предыдущих версиях терминала я этого ни разу не замечал, хотя пользуюсь этим механизмом для отладки много лет. В 8.7 тоже было все нормально , а вот в 8.8 - нате вам.

может, причуды галактической пыли, может, у меня резкость пропала, а может и нога попала в колесо у разработчиков.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Цитата
s_mike@rambler.ru написал:
в getinfo по функции иногда не фигурирует ее название
По ссылке выше как раз ответ, если функция вызвана через pcall, дебаггер ее имя не найдет. От себя добавлю, что в квике все колбеки вызываются через pcall, инфа сотка.
 
Цитата
Anton написал:
Цитата
   s_mike@rambler.ru написал:
в getinfo по функции иногда не фигурирует ее название
По ссылке выше как раз ответ, если функция вызвана через pcall, дебаггер ее имя не найдет. От себя добавлю, что в квике все колбеки вызываются через pcall, инфа сотка.
то есть я не смогу получить ни одно название функции, вызванной в колбеке или предопределенной функции индикатора?

это утверждение опровергается практикой. Инфа сотка стопудово )
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Цитата
s_mike@rambler.ru написал:
то есть я не смогу получить ни одно название функции, вызванной в колбеке или предопределенной функции индикатора?
Не так, имя самого колбека только.
 
Поверим теорию практикой
Код
local run = true

function main()
   local t = debug.getinfo(1)
   message('main name is ' .. (t.name or 'nil'))
   while run do
      sleep(100)
   end
end

function OnStop()
   local t = debug.getinfo(1)
   message('OnStop name is ' .. (t.name or 'nil'))
   local function inner()
      local t = debug.getinfo(1)
      message('OnStop::inner name is ' .. (t.name or 'nil'))
   end
   inner()
   run = false
end
 
И что получается, чтобы не повторять уже вами сделанное?

и если не трудно, вызовите из onstop внешнюю локальную и внешнюю глобальную функции. Покажут ли они свое имя?
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Получается имена мейна и онстопа - нил, имя вложенной функции находит правильно. Как теория и предполагала. С внешними и с SearchItems до кучи, чтобы два раза не вставать, результаты в комментариях

Код
local run = true

function comparator(lhs, rhs)
   local t = debug.getinfo(1)
   message('comparator name is ' .. (t.name or 'nil'))
   return true
end

local function local_comparator(lhs, rhs)
   local t = debug.getinfo(1)
   message('local_comparator name is ' .. (t.name or 'nil'))
   return true
end

function main()
   while run do
      sleep(100)
   end
end

function OnStop()
   local function very_local_comparator(lhs, rhs)
      local t = debug.getinfo(1)
      message('very_local_comparator name is ' .. (t.name or 'nil'))
      return true
   end
   comparator(1, 2) -- MSG: comparator
   local_comparator(1, 2) -- MSG: local_comparator
   very_local_comparator(1, 2) -- MSG: very_local_comparator
   SearchItems('all_trades', 0, 1, comparator) -- MSG: nil
   SearchItems('all_trades', 0, 1, local_comparator) -- MSG: nil
   SearchItems('all_trades', 0, 1, very_local_comparator) -- MSG: nil
   run = false
end
 
Чем дальше в лес, тем злее партизаны )

разобрались , Антон, спасибо за участие.
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Если функция передается в качестве аргумента, то в debug.getinfo(1).name будет имя не самой функции, а имя аргумента.

Код
local function local_comparator(lhs, rhs)
   local t = debug.getinfo(1)
   message('local_comparator name is ' .. (t.name or 'nil'))
   return true
end

function f(arg) arg() end

f(local_comparator) -- MSG: local_comparator name is arg

Есть способ узнать имя функции?
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Старатель написал:
Есть способ узнать имя функции?
Почитайте (единственный) ответ на SO по ссылке выше. Ключевое там вот что: в луа все функции анонимны. Сначала определяется анонимное тело, затем анонимное тело присваивается какой-то переменной. Иначе говоря, имя функции не является ее атрибутом, одновременно одно и то же тело может быть присвоено разным переменным, какая из них - правильное имя? То есть правильный ответ - а нет у функции никакого имени.  Чисто для удобства отладчик считает, что ближайшая по контексту переменная, хранящая функцию, и есть искомое имя, в данном случае имя аргумента.
 
Я по ошибкам вывожу строку текста через debug.getinfo(2), а в assert есть имя функции, аргумента, чтобы в тексте ошибки было имя. Часто этого достаточно для понимания что и где.
Правда если скомпилировать без отладочной информации, что всегда и делается, то информация теряется. Для этого, как раз в assert имя функции и прописывается.
Если же это для каких-то логических целей, то лучше не через debug.getinfo решать вопрос, конечно.
Страницы: 1
Читают тему
Наверх