Сейчас разрабатываю функционал трассировки кода.
Трассировка будет включаться методом Сервис::УровеньТрассировки(). В метод передается устанавливаемый уровень, имя файла, в который сохраняется трассировка и список отслеживаемых переменных.
Есть мысль сделать предопределенную функцию, в которую будет передаваться контекст исполнения, и которая будет возвращать дополнительную строку для лога.
Обсуждаем, дополняем.
Неплохо бы еще добавить директиву препроцессора //TRACER ON, как это сделано в Tracer1C (https://infostart.ru/1c/tools/16676/) или как-то еще указывать что именно надо трассировать.
Это очень сильно уменьшает количество сообщений в трассировке.
Цитата: Djelf от 16 февраля 2024, 11:47Неплохо бы еще добавить директиву препроцессора //TRACER ON, как это сделано в Tracer1C (https://infostart.ru/1c/tools/16676/) или как-то еще указывать что именно надо трассировать.
Это очень сильно уменьшает количество сообщений в трассировке.
Ну, идея ведь была в том, чтобы делать трассировку без какого-либо вмешивания в код. Т.е. включили трассировку, запустили обработку, посмотрели как прошло.
К тому же боюсь, что анализ кода в момент исполнения даст лишние тормоза. А предварительно модуль будет не проанализировать.
Может тогда Сервис::МодулиДляТрассировки(СписокМодулей)? Без указания модулей - все модули.
А в каком тогда виде задавать список модулей?
Тогда уж надо делать ДобавитьМодульДляТрассировки и УдалитьМодульДляТрассировки.
Мда... Вырисовывается вынос этого функционала в отдельный объект. Сервис и так уже перегружен методами.
Модуль Контур.Диадок для 7.7 (https://www.diadoc.ru/order1c#tab-2) смотрел? Там сильно заморочено трассировка сделана, но может на какие-то мысли наведет.
Если трассировать все, то ПриДвиженииМыши может весь лог спамом завалить...
Цитата: АЛьФ от 16 февраля 2024, 12:24А в каком тогда виде задавать список модулей?
Тогда уж надо делать ДобавитьМодульДляТрассировки и УдалитьМодульДляТрассировки.
Мда... Вырисовывается вынос этого функционала в отдельный объект. Сервис и так уже перегружен методами.
В соответствии с ПриЗагрузкеМодуляФормы(<ИмяОбъекта>)
Цитата: Djelf от 16 февраля 2024, 12:36Модуль Контур.Диадок для 7.7 (https://www.diadoc.ru/order1c#tab-2) смотрел? Там сильно заморочено трассировка сделана, но может на какие-то мысли наведет.
Как-то копал модуль Диадока, когда свою с ними интеграцию делал. Не помню уже что там по трассировки. Помню там у них уж больно все запутано было... Или это я с другими их путаю...
Цитата: Djelf от 16 февраля 2024, 12:36Если трассировать все, то ПриДвиженииМыши может весь лог спамом завалить...
Даже просто цикл в отчете с обращением к какой-нибудь глобальной функции форматирования засрет трассировку до полной невменяемости. Я потому раньше за это и не брался. А там же дальше пойдут идеи по вьюверу для этого лога.
Или вот функции, которые выполняются при обновлении формы - их часто можно не логировать
Ой, ой, ой... Очень муторная работа видимо будет.
Список включаемых модулей, список исключаемых модулей, список включаемых Процедур/Функций, список исключаемых Процедур/Функций, может ну его нафиг?
Мы и так замерим, а ты что-то еще креативнее придумаешь!
З.Ы. заменил бинарным редактором в Tracer1C 1cpp.dll, на 2cpp.dll, это работает!
Требуется невероятно редко, как детектор крэша 1С на конкретной фазе выполнения.
Не, ну прям вот в таком объеме я явно делать не буду. Логика применения трассировки - постепенное увеличение уровня, чтобы выйти на нужно место. В моем понимании.
В итоге на самом подробном уровне будет уже не очень большой текст в логе, т.к. место для лога по шагам локализовано.
Поддерживаю. Слишком затратно
Цитата: Djelf от 16 февраля 2024, 15:18З.Ы. заменил бинарным редактором в Tracer1C 1cpp.dll, на 2cpp.dll, это работает!
Не понял, это зачем?
Оно не работало при загрузке после 1cpp.dll, так вот и вылечил, может версия такая, а может ветер был южный.
Всплыла еще одна особенность трассировки.
В качестве исходного кода текущей строки возвращается именно та строка, на которую передается исполнение. Т.е. если, например, условие в Если разбито на несколько строк кода, то в трассировку попадет только первая.
Мысли вслух.
Завис на получении возвращаемого из функции значения. Как-то хитро 1С хранит это значение. Ну, т.е. понятно, что для возвращаемого значения создается специальная служебная переменная "00<ИмяФункции>Val", но в перехвате OnExitProc мы находимся уже в процедуре, куда вернулись и переменные прошлой функции уже недоступны. Логика подсказывает, что возвращенное значение должно еще где-то быть, ведь в опкоде как-то присваивает локальной переменной возвращенное значение.
По ходу дела подумал, что можно получить прикольный эффект: добавить метод УстановитьВозвращаемоеЗначение, в котором служебной переменной будем присваивать нужное значение. В таком случае и Возврат не нужен.
Вот охренеет другой программист, пытаясь разобраться в таком коде...
Тут интересно вот что: что вернёт функция штатно, если в ней отсутствует явное указание оператора Возврат..?
Как-то давно попадалась инфа что будет возвращено последнее вычисленное значение... Не проверял, но меня гложут сомнения...
Цитата: Злоп от 19 февраля 2024, 21:51Тут интересно вот что: что вернёт функция штатно, если в ней отсутствует явное указание оператора Возврат..?
Как-то давно попадалась инфа что будет возвращено последнее вычисленное значение... Не проверял, но меня гложут сомнения...
Штатно вернет пустое значение неопределенного вида. Как если объявить переменную через "Перем", но не присваивать ей значения.
Решил потестить трассировку. Сделал простую внешнюю обработку.
Процедура Сформировать()
ЛокСерв=СоздатьОбъект("Сервис");
ИмяЛога=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м режиме.
Цитата: alyuev от 04 марта 2024, 18:46Решил потестить трассировку. Сделал простую внешнюю обработку.
Спасибо. Вроде поправил.