Модуль для вывода отладочной информации
- Smitis
- Posts: 1709
- Joined: Fri 18 Mar, 2005 12:51
- Location: Питер
- Has thanked: 23 times
- Been thanked: 55 times
Модуль для вывода отладочной информации
Модуль использует функцию OutputDebugStringW, посылающюю стpоку отладчику, если он пpисутствует.
Вывод OutputDebugStringW может перехватываться утилитой DebugView, в результате получаем хорошее средство для вывода отладочных данных не устанавливая никаких отладчиков.
Модуль содержит четыре функции:
print(...) - аналог стандартной функции print, если параметров несколько, между ними выводится текст-разделитель. Текст-разделитель можно поменять непосредственно в скрипте, по умолчанию это один символ табуляции.
printf(fmt,...) - аналог С-шной функции, обёртка над print и string.format
clear() - очистка окна DebugView
filter(filt,delim) - при вызове функции будут созданы функции аналогичные предыдущим, но при вызове которых в начало каждой выводимой строки будет добавляться текст, заданный параметром filt:
- пустая строка - ничего не будет добавляться,
- не пустая строка - будет добавлена в начало каждой строки,
- числовое значение 0 - в начало каждой строки будет добавлено имя исходного файла lua,
- числовое значение, отличное от 0 - в начало каждой строки будет добавлено имя исходного файла и номер строки.
Не пустое значение filt будет отделено от основного текста пробелом. После имени исходного файла и после номера строки будут добавлены двоеточия.
Параметр delim, если присутствует, задаёт новую строку-разделитель параметров для print.
Использование фильтра сделано для удобства использования фильтра в DebugView. Так для приведённого выше примера 2 задаём в DebugView фильтр "FAR:" (без кавычек) который с большой вероятностью отсеет весь левый "мусор", который выводят другие программы (например, этим грешит Far2->Far3 plugin wrapper) и при этом не надо указывать фильтр каждый раз. В случае, если параметр filt задан числовым значением, для фильтра DebugView можно использовать имя исходного файла.
Установка: поместить модуль в папку %farprofile%\macros\modules
Для вывода русского и пр. текста модули должны быть в кодировке CP 65001 (UTF-8).
Вывод OutputDebugStringW может перехватываться утилитой DebugView, в результате получаем хорошее средство для вывода отладочных данных не устанавливая никаких отладчиков.
Модуль содержит четыре функции:
print(...) - аналог стандартной функции print, если параметров несколько, между ними выводится текст-разделитель. Текст-разделитель можно поменять непосредственно в скрипте, по умолчанию это один символ табуляции.
printf(fmt,...) - аналог С-шной функции, обёртка над print и string.format
clear() - очистка окна DebugView
filter(filt,delim) - при вызове функции будут созданы функции аналогичные предыдущим, но при вызове которых в начало каждой выводимой строки будет добавляться текст, заданный параметром filt:
- пустая строка - ничего не будет добавляться,
- не пустая строка - будет добавлена в начало каждой строки,
- числовое значение 0 - в начало каждой строки будет добавлено имя исходного файла lua,
- числовое значение, отличное от 0 - в начало каждой строки будет добавлено имя исходного файла и номер строки.
Не пустое значение filt будет отделено от основного текста пробелом. После имени исходного файла и после номера строки будут добавлены двоеточия.
Параметр delim, если присутствует, задаёт новую строку-разделитель параметров для print.
Использование фильтра сделано для удобства использования фильтра в DebugView. Так для приведённого выше примера 2 задаём в DebugView фильтр "FAR:" (без кавычек) который с большой вероятностью отсеет весь левый "мусор", который выводят другие программы (например, этим грешит Far2->Far3 plugin wrapper) и при этом не надо указывать фильтр каждый раз. В случае, если параметр filt задан числовым значением, для фильтра DebugView можно использовать имя исходного файла.
Установка: поместить модуль в папку %farprofile%\macros\modules
Для вывода русского и пр. текста модули должны быть в кодировке CP 65001 (UTF-8).
- Attachments
-
- dbgprint.1.04.7z
- (1.53 KiB) Downloaded 165 times
- Smitis
- Posts: 1709
- Joined: Fri 18 Mar, 2005 12:51
- Location: Питер
- Has thanked: 23 times
- Been thanked: 55 times
Re: Модули для вывода отладочной информации
1. Без этой строки работает. Видимо, эта информация уже есть в ffi.Shmuel wrote:1. Почему в модулях нет вызова ffi.cdef для функции OutputDebugStringW ?
2. Зачем делать два микромодуля, почему не объединить их в один ?
2. Первый модуль "классический", возвращает таблицу. Второй возвращает функцию. Как их объеденить, чтобы это не очень криво выглядело?
Разум когда-нибудь победит.
-
- Posts: 6820
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 528 times
Re: Модули для вывода отладочной информации
1. У меня без этой строки LuaJIT выдаёт ошибку.Smitis wrote:1. Без этой строки работает. Видимо, эта информация уже есть в ffi.
2. Первый модуль "классический", возвращает таблицу. Второй возвращает функцию. Как их объеденить, чтобы это не очень криво выглядело?
2. Возвращать функцию в таблице, ничего кривого в этом нет.
- Smitis
- Posts: 1709
- Joined: Fri 18 Mar, 2005 12:51
- Location: Питер
- Has thanked: 23 times
- Been thanked: 55 times
Re: Модули для вывода отладочной информации
Интересно, почему у меня работает без этой строки? Я сегодня её удалил в качестве эксперимента. Если я вызываю функцию
2. Первоначально так и было, третья функция Filter создавала две новые. Но такой модуль показался мне избыточным - обычно нужен либо первый способ, либо второй.
П.С.
Чудес не бывает, это у меня в одном из старых скриптов описание осталось...
Исправил.
C.OutputDebugStringW(win.Utf8ToUtf16(str..'\0'))
, то при перезагрузке макросов вылетает ошибка "const unsigned short *" всегда независимо от того, что я пишу в описании через ffi.cdef. Это натолкнуло меня на подозрение, что где-то описание этой функции уже есть.2. Первоначально так и было, третья функция Filter создавала две новые. Но такой модуль показался мне избыточным - обычно нужен либо первый способ, либо второй.
П.С.
Чудес не бывает, это у меня в одном из старых скриптов описание осталось...
Исправил.
Разум когда-нибудь победит.
- John Doe
- Бюрократ
- Posts: 13810
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 427 times
- Contact:
Re: Модули для вывода отладочной информации
Вроде бы ничто не мешает разместить оба способа в одном модуле.Smitis wrote: обычно нужен либо первый способ, либо второй.
И спасибо за отличную идею!
Особенно удобно при отладке обработчиков событий в диалогах, ведь там far.Message может иметь весьма нежелательные последствия.
Ещё одной проблемой там является то, что LuaMacro выдаёт свои сообщения в far.Message (на мантисе уже есть соответствующее пожелание: 0002416: Возможность вместо сообщений об ошибках вызывать "пользовательскую" lua-функцию).
P.S.
А для вывода таблиц можно использовать inspect.lua или что-то аналогичное
Пример:
Code: Select all
local dbg = require("dbgprint")
local inspect = require("inspect")
dbg.printf(inspect({1,2,3,b=2,a=1}))
- John Doe
- Бюрократ
- Posts: 13810
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 427 times
- Contact:
Re: Модули для вывода отладочной информации
Не учитывается возможность многострочных значений.Smitis wrote: Модуль dbgview
...
Переданный параметр будет атоматически добавляться в начало каждой строки выводимой функциями (с разделительным пробелом).
Функции первого модуля можно расматривать как частный случай второго.Smitis wrote:2. Первоначально так и было, третья функция Filter создавала две новые. Но такой модуль показался мне избыточным - обычно нужен либо первый способ, либо второй.
И определить всё в одном модуле так:
Code: Select all
local dbgprint, dbgprintf = dbgview()
return { print=dbgprint, printf=dbgprintf, setfilter=dbgview}
- Smitis
- Posts: 1709
- Joined: Fri 18 Mar, 2005 12:51
- Location: Питер
- Has thanked: 23 times
- Been thanked: 55 times
Re: Модули для вывода отладочной информации
Ладно, объеденю (как в самой первой (нулевой) версии)
- Разделитель параметров задан в переменной, при желании можно поменять
- Разделитель можно передать вторым параметром функции filter
- Многострочность
- Разделитель параметров задан в переменной, при желании можно поменять
- Разделитель можно передать вторым параметром функции filter
- Многострочность
Разум когда-нибудь победит.
- John Doe
- Бюрократ
- Posts: 13810
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 427 times
- Contact:
Re: Модуль для вывода отладочной информации
В случае если попробовать выполнить print с параметром nil, то переменная str остаётся неинициализированной, и получаем ошибку:
ipairs не подходит для использовать с vararg, и это проблема:
Решается заменой строки 15 на
Плюс отдельно стоит учитывать попытку вызова функции без параметров.
Code: Select all
C:\apps\far3\Profile\Macros\modules\dbgprint.lua:15: attempt to index local 'str' (a nil value)
Решается заменой строки 15 на
Code: Select all
for i=1,select("#",...) do
local s = tostring(select(i,...))
str = str and str..delim..s or s
end
- John Doe
- Бюрократ
- Posts: 13810
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 427 times
- Contact:
Re: Модуль для вывода отладочной информации
Полезная команда для очистки лога:
Стоит добавить в модуль как функцию
dbgprint"DBGVIEWCLEAR"
Стоит добавить в модуль как функцию
clearlog
- John Doe
- Бюрократ
- Posts: 13810
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 73 times
- Been thanked: 427 times
- Contact:
Re: Модуль для вывода отладочной информации
Предлагаю ещё одну функцию:
И я бы организовал ваш модуль так:
Code: Select all
local function dbgprintfrom(...)
local info = debug.getinfo(2)
dbgprint(("%s:%s"):format(info.source:match"[^\\]+$",info.currentline),...)
end
- Smitis
- Posts: 1709
- Joined: Fri 18 Mar, 2005 12:51
- Location: Питер
- Has thanked: 23 times
- Been thanked: 55 times
Re: Модуль для вывода отладочной информации
И по сути возвращаемся к первоначальному варианту, когда было два модуля (второй модуль dbgview).John Doe wrote:И я бы организовал ваш модуль так
Разум когда-нибудь победит.
- Smitis
- Posts: 1709
- Joined: Fri 18 Mar, 2005 12:51
- Location: Питер
- Has thanked: 23 times
- Been thanked: 55 times
Re: Модуль для вывода отладочной информации
А какая разница? Первый был более общий, можно сказать, классически, модуль, возвращает таблицу, как и положено. Но на фоне того, что многие приложения отправляют через OutputDebugString свою информацию и это могут как плагины ФАРа так и другие скрипты, был второй вариант, каждый раз создающий новые функции с новым автоматически добавляемым текстом - "фильтром". Собственно, я только второй и использую. Но и первый, вроде как, имеет право быть, как вариант, на любителя.John Doe wrote:Так один же
Проблема, получается, не в том, что модули были разделены, а что непонятно какой лучше выбрать
Разум когда-нибудь победит.