Почему-то на нашем проекте долгое время не уделялось внимание анализу крэшей. Вообще не было никакой возможности понять, почему у пользователя упала наша программа. Я не видел никаких PDB-файлов для периодических сборок. Компилировать из исходников весь проект долго, может понадобиться полчаса-час. Тогда первым делом я перенастроил все многочисленные проекты в солюшене (проект компилируется под Visual Studio), чтобы в конфигурации Release генерировалась отладочная информация, и стал прикладывать архив с PDB-файлами в хранилище сборок.
После этого мы научили тех. поддержку делать крэш дампы. Если у пользователя падала программа, он мог по инструкциям тех. поддержки сгенерировать крэш дамп и переслать его нам. Имея бинарники и PDB-файлы для той сборки, которая установлена у пользователя, ошибки стало искать не трудно.
После этого захотелось сделать автоматическую генерацию крэш-дампов с автоматической пересылкой к нам, как это делает WER.
Для перехвата исключений в Windows есть специальная функция SetUnhandledExceptionFilter. На codeproject есть простейший пример ее использования:
SetUnhandledExceptionFilter and the C/C++ Runtime Library
Но, почитав статьи с описанием техники перехвата исключений, я понял, что здесь есть некоторые неявные проблемы, для которых нужно специальное решение. Кроме того, мало перехватить исключение и сгенерировать дамп, хочется еще и переслать его и на сервере обработать и, в идеале, вести там какую-то статистику.
Поискал что есть из готовых решений. Обнаружил два, на мой взгляд, самых стоящих проекта. Оба очень мощные, оба распространяются под New BSD лицензией, что позволяет использовать их в коммерческих проектах.
crashrpt
google-breakpad
crashrpt - только под Windows, а google-breakpad можно использовать и под Mac и под Linux (под Linux версия еще полностью не закончена). Посмотрел обе впечатление двойственное. Плюсы и минусы по моим оценкам привожу ниже. К общим достоинствам относятся поддержка Unicode, генерация крэш-дампа из внешнего приложения, настрока параметров дампа, оба проекта до сих пор развиваются.
После этого мы научили тех. поддержку делать крэш дампы. Если у пользователя падала программа, он мог по инструкциям тех. поддержки сгенерировать крэш дамп и переслать его нам. Имея бинарники и PDB-файлы для той сборки, которая установлена у пользователя, ошибки стало искать не трудно.
После этого захотелось сделать автоматическую генерацию крэш-дампов с автоматической пересылкой к нам, как это делает WER.
Для перехвата исключений в Windows есть специальная функция SetUnhandledExceptionFilter. На codeproject есть простейший пример ее использования:
SetUnhandledExceptionFilter and the C/C++ Runtime Library
Но, почитав статьи с описанием техники перехвата исключений, я понял, что здесь есть некоторые неявные проблемы, для которых нужно специальное решение. Кроме того, мало перехватить исключение и сгенерировать дамп, хочется еще и переслать его и на сервере обработать и, в идеале, вести там какую-то статистику.
Поискал что есть из готовых решений. Обнаружил два, на мой взгляд, самых стоящих проекта. Оба очень мощные, оба распространяются под New BSD лицензией, что позволяет использовать их в коммерческих проектах.
crashrpt
google-breakpad
crashrpt - только под Windows, а google-breakpad можно использовать и под Mac и под Linux (под Linux версия еще полностью не закончена). Посмотрел обе впечатление двойственное. Плюсы и минусы по моим оценкам привожу ниже. К общим достоинствам относятся поддержка Unicode, генерация крэш-дампа из внешнего приложения, настрока параметров дампа, оба проекта до сих пор развиваются.
crashrpt +
- Хорошая документация для быстрого старта
- Есть готовый GUI для вывода сообщений пользователю, который можно легко локализовать. Диалог достаточно мощный, дает просматривать содержимое данных перед пересылкой, показывает прогресс передачи данных и может скрываться в трее
- Очереди отправки дампов
crashrpt -
- Только Windows, а у нас как раз готовятся работы по портированию под Linux
- Серверную часть придется делать самостоятельно (прием крэш-дампов, статистику и т.д.)
google-breakpad +
- Google! Эта библиотека используется в Google Chrome и Mozilla Firefox. Большое сообщество, проект активно развивается
- Работает под Windows, Mac, Linux
- Интегрируется с сервером Mozilla Soccoro, с помощью которого можно собирать дампы, статистику и т.д.
google-breakpad -
- Хуже документирована и даже информацию о том, как скомпилировать библиотеку, нужно искать в wiki, то описание, что идет с исходниками полного объяснения процесса компиляции не дает
- Нет GUI
Для тех, кто тоже захочет использовать google-breakpad, знайте, что нужно будет сначала установить Python, прописать его в PATH, а затем выполнить из консоли такую инструкцию, чтобы сгенерировать солюшн с проектами для Visual Studio:
src\tools\gyp\gyp.bat src\client\windows\breakpad_client.gyp
Для crashrpt приведу пару ссылок с отличным описанием и картинками :)
Effective Exception Handling in Visual C++
Использование библиотеки CrashRpt
No comments:
Post a Comment