Справочный материал

Элемент <leaks>

Описаны настройки элементов <leaks>, <mem>, <ftextupd> и <query> в файле logcfg.xml: отслеживание утечек памяти, формирование событий технологического журнала и контрольные точки кода.. Элемент <mem>. Элемент <ftextupd>. Элемент <query>

Светящиеся блоки данных в замкнутом контуре между двумя контрольными точками, рядом — аккуратно выделенный незавершённый след утечки памяти.

Элемент <mem>

Элемент <ftextupd>

Элемент <query>

 

Элемент <leaks> настраивает отслеживание утечек памяти, вызванных проблемами в коде решения. По умолчанию отслеживание утечек отключено и не влияет на производительность системы.

Чтобы включить сбор данных об утечках памяти, в файле logcfg.xml следует добавить элемент <leaks>: <leaks collect= "1"> или <leaks collect= "true">.

Чтобы отключить отслеживание утечек памяти, следует изменить элемент <leaks>: <leaks collect="0"> или <leaks collect="false">.

Если отслеживание утечек включено, в разрезе пользователей контролируются создание и удаление следующих объектов:

  • Form/Форма,
  • ManagedForm/УправляемаяФорма,
  • FixedStructure/ФиксированнаяСтруктура,
  • FixedMap/ФиксированноеСоответствие,
  • FormDataStructure/ДанныеФормыСтруктура,
  • FormDataCollection/ДанныеФормыКоллекция,
  • FormDataStructureAndCollection/ДанныеФормыСтруктураСКоллекцией,
  • FormDataCollectionItem/ДанныеФормыЭлементКоллекции,
  • FormDataTree/ДанныеФормыДерево,
  • FormDataTreeItemCollection/ДанныеФормыКоллекцияЭлементовДерева,
  • FormDataTreeItem/ДанныеФормыЭлементДерева,
  • AccountingRegisterManager/РегистрБухгалтерииМенеджер,
  • AccountingRegisterRecordSet/РегистрБухгалтерииНаборЗаписей,
  • ChartOfAccountsManager/ПланСчетовМенеджер,
  • ChartOfAccountsObject/ПланСчетовОбъект,
  • ExchangePlanManager/ПланОбменаМенеджер,
  • ExchangePlanObject/ПланОбменаОбъект,
  • SettingsStoragesManager/ХранилищаНастроекМенеджер,
  • AccumulationRegisterManager/РегистрНакопленияМенеджер,
  • AccumulationRegisterRecordSet/РегистрНакопленияНаборЗаписей,
  • ChartOfCharacteristicTypesManager/ПланВидовХарактеристикМенеджер,
  • ChartOfCharacteristicTypesObject/ПланВидовХарактеристикОбъект,
  • ConstantManager/КонстантаМенеджер,
  • DocumentManager/ДокументМенеджер,
  • DocumentObject/ДокументОбъект,
  • EnumManager/ПеречислениеМенеджер,
  • ExternalDataProcessor/ВнешняяОбработка,
  • ExternalRepor/ВнешнийОтчетt,
  • InformationRegisterManager/РегистрСведенийМенеджер,
  • InformationRegisterRecordSet/РегистрСведенийНаборЗаписей,
  • DataProcessorManager/ОбработкаМенеджер,
  • DataProcessor/Обработка,
  • CatalogManager/СправочникМенеджер,
  • CatalogObject/СправочникОбъект,
  • ReportManager/ОтчетМенеджер,
  • Report/Отчет,
  • SequenceRecordSet/ПоследовательностьНаборЗаписей,
  • BusinessProcessManager/БизнесПроцессМенеджер,
  • BusinessProcessObject/БизнесПроцессОбъект,
  • TaskManager/ЗадачаМенеджер,
  • TaskObject/ЗадачаОбъект,
  • ChartOfCalculationTypesManager/ПланВидовРасчетаМенеджер,
  • ChartOfCalculationTypesObject/ПланВидовРасчетаОбъект,
  • CalculationRegisterManager/РегистрРасчетаМенеджер,
  • CalculationRegisterRecordSet/РегистрРасчетаНаборЗаписей,
  • RecalculationRecordSet/ПерерасчетНаборЗаписей,
  • COMSafeArray,
  • KeyAndValue/КлючИЗначение,
  • Array/Массив,
  • FixedArray/ФиксированныйМассив,
  • Map/Соответствие,
  • Structure/Структура,
  • ValueListItem/ЭлементСпискаЗначений,
  • ValueList/СписокЗначений,
  • ValueTable/ТаблицаЗначений,
  • ValueTableRow/СтрокаТаблицыЗначений,
  • ValueTree/ДеревоЗначений,
  • ValueTreeRow/СтрокаДереваЗначений.

Утечки отслеживаются между начальной и конечной контрольными точками кода. В начальной контрольной точке очищаются данные об утечках для текущего пользователя. В конечной контрольной точке формируется и выводится в технологический журнал событие LEAKS, в котором для каждого неосвобожденного экземпляра объекта указывается стек встроенного языка на момент его создания.

Контрольными точками могут быть:

  • начало и конец выполнения встроенного языка на клиенте или сервере;
  • вызов процедуры/функции встроенного языка и возврат из процедуры/функции;
  • начало выполнения одной строки кода встроенного языка и завершение выполнения другой строки кода встроенного языка.

Начальную и конечную контрольные точки определяет элемент <point>. Вложение контрольных точек друг в друга возможно, но игнорируется — утечки подсчитываются только по внешним контрольным точкам. Например, если при выполнении кода конфигурации были пройдены контрольные точки Начальная1, Начальная2, Конечная1, Конечная2, то утечки будут отслеживаться между точками Начальная1 и Конечная2.

Элемент <point> может иметь один из следующих форматов:

<point call="client"/>, <point call="server"/>

Определяет контрольные точки в начале и в конце выполнения встроенного языка на клиенте или сервере, то есть начальная точка будет установлена до начала выполнения встроенного языка на сервере/клиенте, а конечная — в конце выполнения встроенного языка на сервере/клиенте.

<proc="<ИмяМодуля>/<ИмяМетода>"/>

Определяет контрольные точки при вызове и возврате из указанного метода встроенного языка. <ИмяМодуля> содержит полное имя объекта метаданных, которому принадлежит модуль, без названия конфигурации. В таком же формате имена модулей отображает отладчик. <ИмяМетода> содержит название метода. Если аргумент <ИмяМетода> не установлен, контрольные точки будут определены в начале и после завершения выполнения тела модуля. Примеры имен модулей:

  • SessionModule.Module (МодульСеанса.Модуль) – модуль сеанса;
  • OrdinaryApplicationModule.Module (МодульПриложения.Модуль) – модуль обычного приложения;
  • ManagedApplicationModule.Module (МодульУправляемогоПриложения.Модуль) – модуль управляемого приложения;
  • ExternalConnectionModule.Module (МодульВнешнегоСоединения.Модуль) – модуль внешнего соединения;
  • CommonModule.Global.Module (ОбщийМодуль.Глобальный.Модуль) – общий модуль Global/Глобальный;
  • Catalog.Clients.ObjectModule (Справочник.Контрагенты.МодульОбъекта) – модуль элемента справочника Clients/Контрагенты;
  • DataProcessor.DataProcessor1.Form.Form1.Module (Обработка.Обработка1.Форма.Форма1.Форма) – модуль формы Form1/Форма1 обработки DataProcessor1/Обработка1;
  • DataProcessor.DataProcessor2.Form.DefaultForm.Module (Обработка.Обработка2.Форма.ОсновнаяФорма.Форма) – модуль формы DefaultForm/ОсновнаяФорма обработки DataProcessor2/Обработка2.

<point on="<ИмяМодуля>/<НомерСтроки>" Off="<ИмяМодуля>/<НомерСтроки>"/>

Определяет начальную и конечную контрольные точки явным указанием строк кода. Начальная контрольная точка соответствует началу выполнения кода строки, указанной в атрибуте On. Конечная контрольная точка соответствует завершению выполнения кода строки, указанной в атрибуте Off. Нумерация строк начинается с 1. Если начальная контрольная точка достигнута на сервере, то и конечная контрольная точка должна быть достигнута на сервере. Конечной контрольной точкой не может быть последняя строка кода процедуры, функции или тела модуля.

Пример элемента <leaks>:

<leaks collect="1">
    <point call="client"/>
    <point call="server"/>
    <point proc="OrdinaryApplicationModule/"/>
    <point proc="CommonModule.ConnectProcessing.Module/AtServerNoLeaks"/>
    <point on="CommonModule.Services.Module/9" off="CommonModule.Services.Module/11"/>
</leaks>

В этом примере сбор данных об утечках включен. Контрольные точки установлены:

  • в начале и в конце выполнения встроенного языка на клиенте;
  • в начале и в конце выполнения встроенного языка на сервере;
  • в начале и после завершения выполнения тела модуля приложения;
  • при вызове и возврате из метода AtServerNoLeaks()/НаСервереБезУтечки() общего модуля ConnectProcessing/ОбработкаПодключений;
  • на девятой и одиннадцатой строках общего модуля Services/Сервисы.

Предположим, процедура с таким текстом вызывает утечку памяти:

Процедура НаСервереСУтечкой() Экспорт
    М=НовыйМассив;
    М.Добавить(НовыйМассив);
    М[0].Добавить(НовыйМассив);
    М[0][0].Добавить(М);
КонецПроцедуры

Чтобы ее обнаружить, можно включить отслеживание утечек в технологическом журнале с помощью следующей конфигурации:

<config xmlns="http://bas-soft.eu/v8/tech-log">
    <log location="C:\BAS\logs" history="24">
        <event>
            <eq property="name" value="call"/>
        </event>
        <event>
            <eq property="name" value="leaks"/>
        </event>
        <property name="all">
        </property>
    </log>
    <leaks collect="1">
        <point call="server"/>
    </leaks>
</config>

Тогда при вызове сервера или выполнении регламентного задания, если утечки не происходит, фрагмент технологического журнала будет иметь следующий вид:

59:44.4562-2840,CALL,5,process=rphost,p:processName=t76346,t:clientID=428,t:applicationName=JobScheduler,Func=Execute,Module=CommonModule2,Meth=РегламентноеЗаданиеБезУтечки
59:49.4581-2700,CALL,5,process=rphost,p:processName=t76346,t:clientID=430,t:applicationName=JobScheduler,Func=Execute,Module=CommonModule2,Meth=РегламентноеЗаданиеБезУтечки

А если утечка происходит, то такой:

59:48.4768-2885,CALL,5,process=rphost,p:processName=t76346,t:clientID=429,t:applicationName=JobScheduler,Func=Execute,Module=CommonModule2,Meth=РегламентноеЗаданиеСУтечкой
59:48.4769-0,LEAKS,5,process=rphost,Descr='
Array:
ОбщийМодуль.CommonModule2:2:НаСервереСУтечкой();
ОбщийМодуль.CommonModule1:4:М[0].Добавить(НовыйМассив);
 
Array:
ОбщийМодуль.CommonModule2:2:НаСервереСУтечкой();
ОбщийМодуль.CommonModule1:2:М=НовыйМассив;
 
Array:
ОбщийМодуль.CommonModule2:2:НаСервереСУтечкой();
ОбщийМодуль.CommonModule1:3:М.Добавить(НовыйМассив);

В приведенном фрагменте при выполнении регламентного задания (t:applicationName=JobScheduler, Func=Execute) метода РегламентноеЗаданиеСУтечкой() модуля CommonModule2 были созданы и не освобождены три объекта Array (Массив). При этом указаны стеки вызовов встроенного языка на момент создания каждого из объектов.

Элемент <mem>

Если элемент <mem> присутствует, процессы сервера BAF подсчитывают:

  • количество выделенных и не освобожденных фрагментов памяти;
  • суммарный объем выделенных и не освобожденных фрагментов памяти.

Если между моментами времени, когда процесс сервера не выполнял ни одного вызова и ни одного регламентного задания, увеличилось количество выделенных, но не освобожденных фрагментов памяти, формируется событие типа MEM со следующими свойствами:

  • sz – общий объем выделенных процессом, но не освобожденных фрагментов памяти;
  • szd – его изменение с момента вывода предыдущего события MEM;
  • cn – общее количество выделенных процессом, но не освобожденных фрагментов памяти;
  • cnd – его изменение с момента вывода предыдущего события MEM.

Длительность события MEM равна промежутку времени между последним и предпоследним моментами, когда процесс сервера не выполнял ни одного вызова и ни одного регламентного задания. Именно в течение этого времени увеличилось количество занятых процессом фрагментов памяти.

ВНИМАНИЕ!

Указание элемента <mem> в конфигурационном файле технологического журнала несколько снижает производительность системы, особенно при параллельной работе нескольких пользователей.

Например, при такой конфигурации объем распределенной памяти не собирается, а события MEM не выводятся:

<config xmlns="http://bas-soft.eu/v8/tech-log">
    <log location="C:\bas\logs" history="24">
        <event>
            <eq property="name" value="mem"/>
        </event>
        <property name="all"/>
    </log>
</config>

Следующая конфигурация технологического журнала собирает объем распределенной памяти и в случае его увеличения выводит события MEM:

<config xmlns=«http://bas-soft.eu/v8/tech-log">
    <log location="C:\bas\logs" history="24">
        <event>
            <eq property="name" value="mem"/>
        </event>
        <property name="all"/>
    </log>
    <mem/>
</config> 

Элемент <ftextupd>

Элемент <ftextupd> включает формирование расширенной информации о процессе обновления индексов полнотекстового поиска (событие FTETXUpd). Если элемент отсутствует в файле, расширенная информация не включается в технологический журнал.

Атрибуты элемента:

Атрибут logfiles

Наличие расширенной информации в событии FTEXTUpd:

  • 0 (false) – не включать;
  • 1 (true) – включать.

Элемент <query>

Элемент <query> управляет внесением в технологический журнал информации о полях, содержащих NULL при выполнении запроса к внешнему источнику данных, но для которых такое значение не допускается (событие QERR). Включение такого отслеживания может существенно снизить скорость выполнения запросов.

Атрибуты элемента:

Атрибут checkActualNullable

Управляет сбором информации:

  • 1 (true) – информация о полях будет собираться.
  • 0 (false) или элемент <query> отсутствует в файле – информация о полях не собирается.
Записаться по телефону