Модуль для вывода отладочной информации

Здесь обсуждается всё, что касается макросов.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Модуль для вывода отладочной информации

Post by Smitis »

Модуль использует функцию 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).
Attachments
dbgprint.1.04.7z
(1.53 KiB) Downloaded 159 times
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: Модули для вывода отладочной информации

Post by Shmuel »

1. Почему в модулях нет вызова ffi.cdef для функции OutputDebugStringW ?
2. Зачем делать два микромодуля, почему не объединить их в один ?
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Re: Модули для вывода отладочной информации

Post by Smitis »

Shmuel wrote:1. Почему в модулях нет вызова ffi.cdef для функции OutputDebugStringW ?
2. Зачем делать два микромодуля, почему не объединить их в один ?
1. Без этой строки работает. Видимо, эта информация уже есть в ffi.
2. Первый модуль "классический", возвращает таблицу. Второй возвращает функцию. Как их объеденить, чтобы это не очень криво выглядело?
Разум когда-нибудь победит.
Shmuel
Posts: 6815
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 526 times

Re: Модули для вывода отладочной информации

Post by Shmuel »

Smitis wrote:1. Без этой строки работает. Видимо, эта информация уже есть в ffi.
2. Первый модуль "классический", возвращает таблицу. Второй возвращает функцию. Как их объеденить, чтобы это не очень криво выглядело?
1. У меня без этой строки LuaJIT выдаёт ошибку.
2. Возвращать функцию в таблице, ничего кривого в этом нет.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Re: Модули для вывода отладочной информации

Post by Smitis »

Интересно, почему у меня работает без этой строки? Я сегодня её удалил в качестве эксперимента. Если я вызываю функцию C.OutputDebugStringW(win.Utf8ToUtf16(str..'\0')), то при перезагрузке макросов вылетает ошибка "const unsigned short *" всегда независимо от того, что я пишу в описании через ffi.cdef. Это натолкнуло меня на подозрение, что где-то описание этой функции уже есть.

2. Первоначально так и было, третья функция Filter создавала две новые. Но такой модуль показался мне избыточным - обычно нужен либо первый способ, либо второй.

П.С.
Чудес не бывает, это у меня в одном из старых скриптов описание осталось... :oops:
Исправил.
Разум когда-нибудь победит.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: Модули для вывода отладочной информации

Post by John Doe »

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}))
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: Модули для вывода отладочной информации

Post by John Doe »

Smitis wrote: Модуль dbgview
...
Переданный параметр будет атоматически добавляться в начало каждой строки выводимой функциями (с разделительным пробелом).
Не учитывается возможность многострочных значений.
Smitis wrote:2. Первоначально так и было, третья функция Filter создавала две новые. Но такой модуль показался мне избыточным - обычно нужен либо первый способ, либо второй.
Функции первого модуля можно расматривать как частный случай второго.
И определить всё в одном модуле так:

Code: Select all

local dbgprint, dbgprintf = dbgview()
return { print=dbgprint, printf=dbgprintf, setfilter=dbgview}
print может принимать несколько параметров, имхо стоит добавить разделитель, как и в стандартной функции lua
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Re: Модули для вывода отладочной информации

Post by Smitis »

Ладно, объеденю (как в самой первой (нулевой) версии)
- Разделитель параметров задан в переменной, при желании можно поменять
- Разделитель можно передать вторым параметром функции filter
- Многострочность
Разум когда-нибудь победит.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: Модуль для вывода отладочной информации

Post by John Doe »

В случае если попробовать выполнить print с параметром nil, то переменная str остаётся неинициализированной, и получаем ошибку:

Code: Select all

C:\apps\far3\Profile\Macros\modules\dbgprint.lua:15: attempt to index local 'str' (a nil value)
ipairs не подходит для использовать с vararg, и это проблема:
Решается заменой строки 15 на

Code: Select all

			for i=1,select("#",...) do
			  local s = tostring(select(i,...))
			  str = str and str..delim..s or s
			end
Плюс отдельно стоит учитывать попытку вызова функции без параметров.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: Модуль для вывода отладочной информации

Post by John Doe »

Полезная команда для очистки лога: dbgprint"DBGVIEWCLEAR"
Стоит добавить в модуль как функцию clearlog
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Re: Модуль для вывода отладочной информации

Post by Smitis »

Тогда уж для единообразия dbgclear.
Добавлю.
Разум когда-нибудь победит.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: Модуль для вывода отладочной информации

Post by John Doe »

Предлагаю ещё одну функцию:

Code: Select all

	local function dbgprintfrom(...)
	  local info = debug.getinfo(2)
	  dbgprint(("%s:%s"):format(info.source:match"[^\\]+$",info.currentline),...)
	end
И я бы организовал ваш модуль так:
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Re: Модуль для вывода отладочной информации

Post by Smitis »

John Doe wrote:И я бы организовал ваш модуль так
И по сути возвращаемся к первоначальному варианту, когда было два модуля (второй модуль dbgview).
Разум когда-нибудь победит.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

Re: Модуль для вывода отладочной информации

Post by John Doe »

Так один же
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

Re: Модуль для вывода отладочной информации

Post by Smitis »

John Doe wrote:Так один же
А какая разница? Первый был более общий, можно сказать, классически, модуль, возвращает таблицу, как и положено. Но на фоне того, что многие приложения отправляют через OutputDebugString свою информацию и это могут как плагины ФАРа так и другие скрипты, был второй вариант, каждый раз создающий новые функции с новым автоматически добавляемым текстом - "фильтром". Собственно, я только второй и использую. Но и первый, вроде как, имеет право быть, как вариант, на любителя.
Проблема, получается, не в том, что модули были разделены, а что непонятно какой лучше выбрать :)
Разум когда-нибудь победит.
Post Reply

Return to “Обсуждение макросов”