Формирование диагностического протокола работы |
|
|
Диагностический протокол (журнал диагностики) применяется для поиска причин повторяющейся ошибки в работе программы. Если некоторое действие с программой вызывает ошибку, то для ее диагностирования желательно включить запись в диагностический протокол и повторить действие, вызывающее ошибку. Открыть и закрыть диагностический протокол можно 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).
|