Формирование диагностического протокола работы

Previous Top Next

Диагностический протокол (журнал диагностики) применяется для поиска причин повторяющейся ошибки в работе программы. Если некоторое действие с программой вызывает ошибку, то для ее диагностирования желательно включить запись в диагностический протокол и повторить действие, вызывающее ошибку.

Открыть и закрыть диагностический протокол можно API-функциями ГИС-ядра или аналогичными по названию функциями компонента TGisProperty:

 

 // Открыть запись в диагностический протокол

 // logname - путь к протоколу диагностической печати, если равен нулю,

 // то запись идет в \ProgramData\mapdiagnostics.log

 // hideinfo - признак отключения выдачи информационных сообщений (MT_INFO)

 // При ошибке возвращает ноль

mapOpenDiagnosticsEx(const WCHAR* logname, long int hideinfo);

_MAPIMP long int _MAPAPI mapOpenDiagnostics(const WCHAR * logname);

 

 // Запросить - открыт ли диагностический протокол

_MAPIMP long int _MAPAPI mapIsDiagnostics();

 

 // Закрыть запись в диагностический протокол

_MAPIMP void _MAPAPI mapCloseDiagnostics();

 

Журнал диагностики создается в файле \ProgramData\имя_программы.имя_пользователя.log (Например: panorama64.user.log).

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

 

>>>> 08:17:41    ec180 Catch exception for ShowMap, last rendered object = 123, key = 9876, sheet = 1

 

Если в метрике или семантике объекта программой диагностики обнаружены ошибки, то содержимое объекта записывается в папке LOG карты в файл-дамп для возможности анализа причины ошибки. Состояние объекта в дампе обновляется не чаще 1 раза в 5 минут.

Имя файла дампа может иметь вид \LOG\имя_карты.ключ_объекта.dump , например:

\LOG\mymap.9876.dump

 

Путь к файлу записывается в диагностический протокол, например:

---> 12:05:23    1ca Object was saved in dump - \data\map\LOG\mymap.9876.dump

 

При обращении в службу технической поддержки желательно выслать журнал диагностики и файл-дамп объекта, вызвавшего сбой программы.

 

Прикладная задача может сама делать записи в диагностический протокол следующими функциями:

 

 // Записать сообщение в диагностический протокол

 // message - первая часть сообщения

 // messageex - вторая часть сообщения

 // type - тип сообщения (>>> MT_ERROR, --> MT_WARNING, MT_INFO, MT_CONTINUE - продолжение)

 // error - код ошибки, запрошенный у системы (если равен 0, то будет запрошен при выводе сообщения)

 // value - число, которое будет преобразовано в строку и добавлено к сообщению

_MAPIMP void _MAPAPI mapWriteToDiagnosticsLog(const WCHAR * message, const WCHAR * messageex = 0, long int type = MT_ERROR);

_MAPIMP void _MAPAPI mapWriteErrorToDiagnosticsLog(long int code, const WCHAR * message, long int type = MT_ERROR);

_MAPIMP void _MAPAPI mapWriteToLogLastError(const WCHAR * message, const WCHAR * messageex,  long int type = MT_ERROR, long int error = 0);

_MAPIMP void _MAPAPI mapWriteToLogInt(const WCHAR * message, long int value, long int type = MT_INFO);

 

// Включить/Отключить вывод диагностического протокола в консоль

// std::cout << "Diagnostics" << ": " << message << std::endl;

_MAPIMP void _MAPAPI SetConsoleOutput(long int flag);

 

Фрагмент диагностического протокола с информационными сообщениями:

 

    14:39:25    1c2c ShowMap start, name - E:\Polygon\BigSit\sitmvk_2.sit

    14:39:25    1c2c TPaintControl::ShowList begin, number - 1

    14:39:25    1c2c Open access for show list succsessfully, number - 1

    14:39:25    1c2c Show list by showlist. Show count - 225512, showlevel = 3, objectscount = 17709426, point = 112e98e8, frame = 4147818 4112801 4171227 4160748

    14:39:25    1c2c End show list. View object count - 5054/0. Time (msec) = 203

    14:39:25    1c2c Close access for show list succsessfully, number - 1

    14:39:25    1c2c ShowMap end, name - E:\Polygon\BigSit\sitmvk_2.sit

    14:39:25    1c2c Paint map end. Name - E:\Polygon\BigSit\sitmvk_2.sit

 

Фрагмент диагностического протокола с сообщениями об ошибке:

 

    10:24:54    ec031980 Begin open rsc. name - /tmp/test/map5000m.rsc

>>>>     10:24:54 ec031980 Open file error, name - /mnt/533754b8-c637-466e-ab6e-8e46ae0af163/

Test/build-myfirst-Qt_5_12_8_qt5-Debug/altfonts.xml

>>>> !   10:24:54    ec031980 Load library error - /mnt/533754b8-c637-466e-ab6e-8e46ae0af163/Test/build-myfirst-Qt_5_12_8_qt5-Debug/shape.iml64

>>>> !   10:24:54    ec031980 System error message -  [2] Нет такого файла или каталога

    10:24:54    ec031980 Diagnostics: The library was loaded successfully - shape.iml64

    10:24:54    ec031980 End open rsc. time (msk) - 311

 

Если строка начинается с символов >>>>, то это сообщение об ошибке (MT_ERROR).

Если строка начинается с символов >>>> !, то это сообщение об ошибке при доступе к системным ресурсам: ошибка чтения или записи на диск, ошибка загрузки библиотеки и так далее (MT_HARDERROR).

Если строка начинается с символов --->, то это сообщение с важной информацией для анализа протокола (MT_WARNING). Например:

 

---> 11:36:08    7084d980 InitCommonBuffer, used memory percent = 45

 

Все остальные сообщения являются информационными (MT_INFO).