Форум Кладовочки АЛьФ`а

Обсуждение проектов => FormEx => Тема начата: АЛьФ от 16 февраля 2024, 10:31

Название: Трассировка выполнения кода
Отправлено: АЛьФ от 16 февраля 2024, 10:31
Сейчас разрабатываю функционал трассировки кода.
Трассировка будет включаться методом Сервис::УровеньТрассировки(). В метод передается устанавливаемый уровень, имя файла, в который сохраняется трассировка и список отслеживаемых переменных.
Есть мысль сделать предопределенную функцию, в которую будет передаваться контекст исполнения, и которая будет возвращать дополнительную строку для лога.

Обсуждаем, дополняем.
Название: Re: Трассировка выполнения кода
Отправлено: Djelf от 16 февраля 2024, 11:47
Неплохо бы еще добавить директиву препроцессора //TRACER ON, как это сделано в Tracer1C (https://infostart.ru/1c/tools/16676/) или как-то еще указывать что именно надо трассировать.
Это очень сильно уменьшает количество сообщений в трассировке.
Название: Re: Трассировка выполнения кода
Отправлено: АЛьФ от 16 февраля 2024, 11:57
Цитата: Djelf от 16 февраля 2024, 11:47Неплохо бы еще добавить директиву препроцессора //TRACER ON, как это сделано в Tracer1C (https://infostart.ru/1c/tools/16676/) или как-то еще указывать что именно надо трассировать.
Это очень сильно уменьшает количество сообщений в трассировке.
Ну, идея ведь была в том, чтобы делать трассировку без какого-либо вмешивания в код. Т.е. включили трассировку, запустили обработку, посмотрели как прошло.
К тому же боюсь, что анализ кода в момент исполнения даст лишние тормоза. А предварительно модуль будет не проанализировать.
Название: Re: Трассировка выполнения кода
Отправлено: Djelf от 16 февраля 2024, 12:04
Может тогда Сервис::МодулиДляТрассировки(СписокМодулей)? Без указания модулей - все модули.
Название: Re: Трассировка выполнения кода
Отправлено: АЛьФ от 16 февраля 2024, 12:24
А в каком тогда виде задавать список модулей?
Тогда уж надо делать ДобавитьМодульДляТрассировки и УдалитьМодульДляТрассировки.
Мда... Вырисовывается вынос этого функционала в отдельный объект. Сервис и так уже перегружен методами.
Название: Re: Трассировка выполнения кода
Отправлено: Djelf от 16 февраля 2024, 12:36
Модуль Контур.Диадок для 7.7 (https://www.diadoc.ru/order1c#tab-2) смотрел? Там сильно заморочено трассировка сделана, но может на какие-то мысли наведет.
Если трассировать все, то ПриДвиженииМыши может весь лог спамом завалить...
Название: Re: Трассировка выполнения кода
Отправлено: Djelf от 16 февраля 2024, 12:44
Цитата: АЛьФ от 16 февраля 2024, 12:24А в каком тогда виде задавать список модулей?
Тогда уж надо делать ДобавитьМодульДляТрассировки и УдалитьМодульДляТрассировки.
Мда... Вырисовывается вынос этого функционала в отдельный объект. Сервис и так уже перегружен методами.
В соответствии с ПриЗагрузкеМодуляФормы(<ИмяОбъекта>)
Название: Re: Трассировка выполнения кода
Отправлено: АЛьФ от 16 февраля 2024, 12:55
Цитата: Djelf от 16 февраля 2024, 12:36Модуль Контур.Диадок для 7.7 (https://www.diadoc.ru/order1c#tab-2) смотрел? Там сильно заморочено трассировка сделана, но может на какие-то мысли наведет.
Как-то копал модуль Диадока, когда свою с ними интеграцию делал. Не помню уже что там по трассировки. Помню там у них уж больно все запутано было... Или это я с другими их путаю...

Цитата: Djelf от 16 февраля 2024, 12:36Если трассировать все, то ПриДвиженииМыши может весь лог спамом завалить...
Даже просто цикл в отчете с обращением к какой-нибудь глобальной функции форматирования засрет трассировку до полной невменяемости. Я потому раньше за это и не брался. А там же дальше пойдут идеи по вьюверу для этого лога.
Название: Re: Трассировка выполнения кода
Отправлено: Злоп от 16 февраля 2024, 13:02
Или вот функции, которые выполняются при обновлении формы - их часто можно не логировать
Название: Re: Трассировка выполнения кода
Отправлено: Djelf от 16 февраля 2024, 15:18
Ой, ой, ой... Очень муторная работа видимо будет.
Список включаемых модулей, список исключаемых модулей, список включаемых Процедур/Функций, список исключаемых Процедур/Функций, может ну его нафиг?
Мы и так замерим, а ты что-то еще креативнее придумаешь!
З.Ы. заменил бинарным редактором в Tracer1C 1cpp.dll, на 2cpp.dll, это работает!
Требуется невероятно редко, как детектор крэша 1С на конкретной фазе выполнения.
Название: Re: Трассировка выполнения кода
Отправлено: АЛьФ от 16 февраля 2024, 15:53
Не, ну прям вот в таком объеме я явно делать не буду. Логика применения трассировки - постепенное увеличение уровня, чтобы выйти на нужно место. В моем понимании.
В итоге на самом подробном уровне будет уже не очень большой текст в логе, т.к. место для лога по шагам локализовано.
Название: Re: Трассировка выполнения кода
Отправлено: Djelf от 16 февраля 2024, 16:36
Поддерживаю. Слишком затратно
Название: Re: Трассировка выполнения кода
Отправлено: Arbuz от 16 февраля 2024, 16:54
Цитата: Djelf от 16 февраля 2024, 15:18З.Ы. заменил бинарным редактором в Tracer1C 1cpp.dll, на 2cpp.dll, это работает!

Не понял, это зачем?
Название: Re: Трассировка выполнения кода
Отправлено: alyuev от 16 февраля 2024, 17:47
Цитата: Djelf от 16 февраля 2024, 15:182cpp.dll
А это что такое?
Название: Re: Трассировка выполнения кода
Отправлено: Djelf от 16 февраля 2024, 23:57
Оно не работало при загрузке после 1cpp.dll, так вот и вылечил, может версия такая, а может ветер был южный.
Название: Re: Трассировка выполнения кода
Отправлено: АЛьФ от 17 февраля 2024, 11:02
Всплыла еще одна особенность трассировки.
В качестве исходного кода текущей строки возвращается именно та строка, на которую передается исполнение. Т.е. если, например, условие в Если разбито на несколько строк кода, то в трассировку попадет только первая.
Название: Re: Трассировка выполнения кода
Отправлено: АЛьФ от 19 февраля 2024, 12:15
Мысли вслух.
Завис на получении возвращаемого из функции значения. Как-то хитро 1С хранит это значение. Ну, т.е. понятно, что для возвращаемого значения создается специальная служебная переменная "00<ИмяФункции>Val", но в перехвате OnExitProc мы находимся уже в процедуре, куда вернулись и переменные прошлой функции уже недоступны. Логика подсказывает, что возвращенное значение должно еще где-то быть, ведь в опкоде как-то присваивает локальной переменной возвращенное значение.

По ходу дела подумал, что можно получить прикольный эффект: добавить метод УстановитьВозвращаемоеЗначение, в котором служебной переменной будем присваивать нужное значение. В таком случае и Возврат не нужен.
Вот охренеет другой программист, пытаясь разобраться в таком коде...
Название: Re: Трассировка выполнения кода
Отправлено: Злоп от 19 февраля 2024, 21:51
Тут интересно вот что: что вернёт функция штатно, если в ней отсутствует явное указание оператора Возврат..?
Как-то давно попадалась инфа что будет возвращено последнее вычисленное значение... Не проверял, но меня гложут сомнения...
Название: Re: Трассировка выполнения кода
Отправлено: АЛьФ от 19 февраля 2024, 22:01
Цитата: Злоп от 19 февраля 2024, 21:51Тут интересно вот что: что вернёт функция штатно, если в ней отсутствует явное указание оператора Возврат..?
Как-то давно попадалась инфа что будет возвращено последнее вычисленное значение... Не проверял, но меня гложут сомнения...
Штатно вернет пустое значение неопределенного вида. Как если объявить переменную через "Перем", но не присваивать ей значения.
Название: Re: Трассировка выполнения кода
Отправлено: alyuev от 04 марта 2024, 18:46
Решил потестить трассировку. Сделал простую внешнюю обработку.

Процедура Сформировать()
ЛокСерв=СоздатьОбъект("Сервис");
ИмяЛога=ACLog+"Трассировка"+режТрасс+".txt";
ЛокСерв.УровеньТрассировки(0, ИмяЛога);
ЛокСерв.УровеньТрассировки(режТрасс, ИмяЛога);
Стр=контТип(Контекст);
Сообщить("Стр="+Стр);
ЛокСерв.УровеньТрассировки(0, ИмяЛога);
КонецПроцедуры

Для режТрасс=3 в лог стало попадать всякие события и до конца заполнения не дождался. Сбросил процесс.

Вот кусок лога:

(OnNextLine)[04/03.2024 15:32:17.518][ffffffff][E:\CONFIG\EXTFORMS3\ТЕСТТРАССИРОВКИ.ERT][7][Сформировать] Стр=контТип(Контекст);
(OnEnterProc)[04/03.2024 15:32:17.518][00000001][Global Module][-1][контТип]
Аргументы:
Конт: ГрупповойКонтекст
(OnNextLine)[04/03.2024 15:32:17.518][00000001][Global Module][728][контТип]
(OnNextLine)[04/03.2024 15:32:17.518][00000001][Global Module][730][контТип]
(OnNextLine)[04/03.2024 15:32:17.519][00000001][Global Module][732][контТип]
(OnNextLine)[04/03.2024 15:32:17.519][00000001][Global Module][735][контТип]
(OnNextLine)[04/03.2024 15:32:17.519][00000001][Global Module][737][контТип]
(OnNextLine)[04/03.2024 15:32:17.519][00000001][Global Module][740][контТип]
(OnNextLine)[04/03.2024 15:32:17.519][00000001][Global Module][742][контТип]
(OnNextLine)[04/03.2024 15:32:17.519][00000001][Global Module][743][контТип]
(OnNextLine)[04/03.2024 15:32:17.519][00000001][Global Module][744][контТип]
(OnNextLine)[04/03.2024 15:32:17.520][00000001][Global Module][745][контТип]
(OnNextLine)[04/03.2024 15:32:17.520][00000001][Global Module][749][контТип]
(OnEnterProc)[04/03.2024 15:32:18.911][ffffffff][D:\SPEEDFLOW\ACINI\CLASSES\__КЛАССФАБРИКАСОБЫТИЙ__.ERT][-1][СобытиеГМ_ПриНажатииЛевойКнопки]
Аргументы:
Конт:
КШ: 0
_X: 215
_Y: 95
ФлСО: 1
(OnNextLine)[04/03.2024 15:32:18.911][ffffffff][D:\SPEEDFLOW\ACINI\CLASSES\__КЛАССФАБРИКАСОБЫТИЙ__.ERT][1443][СобытиеГМ_ПриНажатииЛевойКнопки] СообщитьВОтладке("Событие_ПриНажатииЛевойКнопки КШ="+КШ+" _X="+_X+" _Y="+_Y);
(OnEnterProc)[04/03.2024 15:32:18.912][00000001][Global Module][-1][СообщитьВОтладке]
Аргументы:
Т: Событие_ПриНажатииЛевойКнопки КШ=0 _X=215 _Y=95
Условие:
Маркер:
(OnNextLine)[04/03.2024 15:32:18.912][00000001][Global Module][1483][СообщитьВОтладке] Если Отладка=1 Тогда
(OnEnterProc)[04/03.2024 15:32:18.912][00000001][Global Module][-1][глКАШ]
Аргументы:
(OnNextLine)[04/03.2024 15:32:18.912][00000001][Global Module][1474][глКАШ] Возврат 0;
(OnEnterProc)[04/03.2024 15:32:18.912][00000001][Global Module][-1][глСтатусКлавиши]
Аргументы:
(OnNextLine)[04/03.2024 15:32:18.913][00000001][Global Module][1462][глСтатусКлавиши] Перехватчик = СоздатьОбъект("Перехватчик");
(OnNextLine)[04/03.2024 15:32:18.913][00000001][Global Module][1468][глСтатусКлавиши] СообщитьВОтладке("Событие_ПриНажатииПравойКнопки КШ="+КШ+" _X="+_X+" _Y="+_Y);
(OnNextLine)[04/03.2024 15:32:18.913][00000001][Global Module][1469][глСтатусКлавиши] НажатаКнопкаМыши="правая";

При этом режТрасс=1 и 2 отрабатывают корректно, как мне кажется. Во лог для 2:

(OnNextLine)[04/03.2024 15:33:44.319][ffffffff][E:\CONFIG\EXTFORMS3\ТЕСТТРАССИРОВКИ.ERT][7][Сформировать] Стр=контТип(Контекст);
(OnEnterProc)[04/03.2024 15:33:44.320][00000001][Global Module][-1][контТип]
(OnNextLine)[04/03.2024 15:33:44.320][00000001][Global Module][728][контТип]
(OnNextLine)[04/03.2024 15:33:44.320][00000001][Global Module][730][контТип]
(OnNextLine)[04/03.2024 15:33:44.320][00000001][Global Module][732][контТип]
(OnNextLine)[04/03.2024 15:33:44.320][00000001][Global Module][735][контТип]
(OnNextLine)[04/03.2024 15:33:44.320][00000001][Global Module][737][контТип]
(OnNextLine)[04/03.2024 15:33:44.320][00000001][Global Module][740][контТип]
(OnNextLine)[04/03.2024 15:33:44.320][00000001][Global Module][742][контТип]
(OnNextLine)[04/03.2024 15:33:44.321][00000001][Global Module][743][контТип]
(OnNextLine)[04/03.2024 15:33:44.321][00000001][Global Module][744][контТип]
(OnNextLine)[04/03.2024 15:33:44.321][00000001][Global Module][745][контТип]
(OnNextLine)[04/03.2024 15:33:44.321][00000001][Global Module][749][контТип]
(OnExitProc)[04/03.2024 15:33:44.321][ffffffff][E:\CONFIG\EXTFORMS3\ТЕСТТРАССИРОВКИ.ERT][-1][Сформировать]
(OnNextLine)[04/03.2024 15:33:44.321][ffffffff][E:\CONFIG\EXTFORMS3\ТЕСТТРАССИРОВКИ.ERT][8][Сформировать] Сообщить("Стр="+Стр);
(OnNextLine)[04/03.2024 15:33:44.324][ffffffff][E:\CONFIG\EXTFORMS3\ТЕСТТРАССИРОВКИ.ERT][9][Сформировать] ЛокСерв.УровеньТрассировки(0, ИмяЛога);

Вот содержимое функции контТип():

Функция контТип(Конт) Экспорт
Перем Путь,Имя,Вид;
Если ТипЗначенияСтр(Конт)<>"ГрупповойКонтекст" Тогда
Возврат ТипЗначенияСтр(Конт);
КонецЕсли;
Попытка
Вид=Конт.ТекущийДокумент().Вид();
Возврат "Документ";
Исключение
КонецПопытки;
Попытка
Вид=Конт.ТекущийЭлемент().Вид();
Возврат "Справочник";
Исключение
КонецПопытки;
Попытка
Путь="";
Имя="";
Конт.РасположениеФайла(Путь, Имя);
Возврат "ДФ";
Исключение
КонецПопытки;
Возврат "Форма";
КонецФункции

Вместо контТип() пробовал другие, простые функции. На 1, 2 строки. Они отработали нормально в 3м режиме.
Название: Re: Трассировка выполнения кода
Отправлено: АЛьФ от 04 марта 2024, 19:31
Цитата: alyuev от 04 марта 2024, 18:46Решил потестить трассировку. Сделал простую внешнюю обработку.

Спасибо. Вроде поправил.