понедельник, 24 ноября 2014 г.

Охота за ошибками.

Я думаю сложно найти программу без ошибок. Так уж случилось что Валентина тоже не лишена этого недостатка. Сказывается отсутствие опыта, тестирования, времени. Некоторые ошибки вообще сложно вычислить.


Я решил написать эту заметку что бы показать что я знаю о их существовании и работаю над их решением.

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

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

Отчеты об ошибках представляют из себя обычные текстовые файлы которые генерируются после каждого краха программы. Отсылка происходит после следующего запуска программы автоматически.

Пример файла отчета:
-------------------

Error occured on Thursday, November 13, 2014 at 13:39:51.

C:\pack\valentina\valentina.exe caused an Access Violation at location 00555689 in module C:\pack\valentina\valentina.exe Reading from location 00000000.

Registers:
eax=00555680 ebx=01156208 ecx=0022fdd0 edx=00000000 esi=0022d108 edi=0022fdd0
eip=00555689 esp=0022cfe0 ebp=0022d068 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=0038  gs=0000             efl=00010202

AddrPC   Params
00555689 00000001 01156208 0022FDD0  valentina.exe!MainWindow::Open()  [C:\build-Valentina-Desktop_Qt_5_3_MinGW_32bit-Release\src\app/../../../Valentina/src/app/mainwindow.cpp @ 1349]
68A56D28 00D585C0 00000003 00000004  Qt5Core.dll!QMetaObject::activate(QObject*, int, int, void**)
61DC3BA7 00000000 00DF01C0 0022D178  Qt5Widgets.dll!QAction::activate(QAction::ActionEvent)
61F24B66 0022D1A8 00D585C0 00000000  Qt5Widgets.dll!QMenu::setIcon(QIcon const&)
61F2A195 00D585C0 00000000 00000001  Qt5Widgets.dll!QMenu::internalDelayedPopup()
61F2E888 0022D670 0022D588 7C9101DB  Qt5Widgets.dll!QMenu::mouseReleaseEvent(QMouseEvent*)
61E0150A 0022D670 0022D310 0022D2F8  Qt5Widgets.dll!QWidget::event(QEvent*)
61F2F04A 0022D670 0022D670 0022D4D8  Qt5Widgets.dll!QMenu::event(QEvent*)
61DC847E 00DF0060 0022D670 0022D698  Qt5Widgets.dll!QApplicationPrivate::notify_helper(QObject*, QEvent*)
61DCDBC5 00DF0060 0022D670 61B38F30  Qt5Widgets.dll!QApplication::notify(QObject*, QEvent*)
005453DE 00DF0060 0022D670 00000000  valentina.exe!VApplication::notify(QObject*, QEvent*)  [C:\build-Valentina-Desktop_Qt_5_3_MinGW_32bit-Release\src\app/../../../Valentina/src/app/core/vapplication.cpp @ 117]
68A37F91 00DF0060 0022D670 0022D5C8  Qt5Core.dll!QCoreApplication::notifyInternal(QObject*, QEvent*)
61DCC07B 00DF0060 0022D670 00000000  Qt5Widgets.dll!QApplicationPrivate::sendMouseEvent(QWidget*, QMouseEvent*, QWidget*, QWidget*, QWidget**, QPointer<QWidget>&, bool)
61E1ADD1 0022DA10 7C91019B 7C9101DB  Qt5Widgets.dll!non-virtual thunk to QWidget::metric(QPaintDevice::PaintDeviceMetric) const
61E1D3D2 0022DA10 0022DA10 0022D8C8  Qt5Widgets.dll!non-virtual thunk to QWidget::metric(QPaintDevice::PaintDeviceMetric) const
61DC847E 011CC1D0 0022DA10 0022D808  Qt5Widgets.dll!QApplicationPrivate::notify_helper(QObject*, QEvent*)
61DCD097 011CC1D0 0022DA10 0022D928  Qt5Widgets.dll!QApplication::notify(QObject*, QEvent*)
005453DE 011CC1D0 0022DA10 00000048  valentina.exe!VApplication::notify(QObject*, QEvent*)  [C:\build-Valentina-Desktop_Qt_5_3_MinGW_32bit-Release\src\app/../../../Valentina/src/app/core/vapplication.cpp @ 117]
68A37F91 011CC1D0 0022DA10 0022D9C0  Qt5Core.dll!QCoreApplication::notifyInternal(QObject*, QEvent*)
6195E8C3 7FFDF000 00030000 0115CAD0  Qt5Gui.dll!QGuiApplicationPrivate::processMouseEvent(QWindowSystemInterfacePrivate::MouseEvent*)
61960098 011D8E28 0022DB60 7E368B26  Qt5Gui.dll!QGuiApplicationPrivate::processWindowSystemEvent(QWindowSystemInterfacePrivate::WindowSystemEvent*)
61949C6E 00000000 00000000 0022DCA8  Qt5Gui.dll!QWindowSystemInterface::sendWindowSystemEvents(QFlags<QEventLoop::ProcessEventsFlag>)
6A8A7B07 00000000 00000001 7E368734  qwindows.dll
7E368734 68A7E550 001601B8 00000401  USER32.dll!GetDC
7E368816 00000000 68A7E550 001601B8  USER32.dll!GetDC
7E3689CD 0022DD88 00000000 0022FAC8  USER32.dll!GetWindowLongW
7E368A10 0022DD88 0022DD88 00000000  USER32.dll!DispatchMessageW
68A7E1A8 77C1C02D 0022FAC0 0022FB70  Qt5Core.dll!QEventDispatcherWin32::processEvents(QFlags<QEventLoop::ProcessEventsFlag>)
6A8A7C07 0022FD00 011912A8 011912A8  qwindows.dll
68A3706C 00000000 0022FDD0 80000000  Qt5Core.dll!QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>)
68A3D3B2 0022FCA4 0022FCA0 0022FCF0  Qt5Core.dll!QCoreApplication::exec()
0054815F 00000001 003E8820 003EC0F0  valentina.exe!~QStringList  [C:\build-Valentina-Desktop_Qt_5_3_MinGW_32bit-Release\src\app/../../../Qt/Qt5.3.2/5.3/mingw482_32/include/QtCore/qstringlist.h @ 61]
00570C50 00400000 00000000 0024238A  valentina.exe
005F261D 003E81E8 00000020 00000001  valentina.exe
004013DE 022DD90C 00000018 7FFDD000  valentina.exe
7C817077 004014C0 00000000 78746341  kernel32.dll!RegisterWaitForInputIdle

Те кто скачали последнюю доступную версию для Windows Valentina-0.2.8.1173-alpha уже имеют эту функцию на борту.

За время роботы функции я получил около 30 сообщений об ошибках и обнаружил что информации доступной в отчете не достаточно.

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

Прошлые отчеты не пропали даром. Я постарался их проанализировать и добавить логирование в те места которые были задействованы в отчете.

Те кто не желает отсылать отчеты об ошибках может отключить эту функцию в настройках программы. В этом случае программа будет аккуратно коллекционировать в папочке reports все отчеты, не отсылая их. Это сделано на случай того, что пользователь захочет сам отправить сообщение об ошибке. Найти ее можно в папке с программой.

Не знаю, или кто заметил, но так же с этим нововведение связана необходимость таскать с программой отладочную информацию. Без нее отчет это просто мусор. Поэтому размер установщика для Windows сейчас самый большой.


Комментариев нет:

Отправить комментарий