Wednesday, April 11, 2012

CrashRpt and google-breakpad

Почему-то на нашем проекте долгое время не уделялось внимание анализу крэшей. Вообще не было никакой возможности понять, почему у пользователя упала наша программа. Я не видел никаких 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, генерация крэш-дампа из внешнего приложения, настрока параметров дампа, оба проекта до сих пор развиваются.

crashrpt +
  1. Хорошая документация для быстрого старта
  2. Есть готовый GUI для вывода сообщений пользователю, который можно легко локализовать. Диалог достаточно мощный, дает просматривать содержимое данных перед пересылкой, показывает прогресс передачи данных и может скрываться в трее
  3. Очереди отправки дампов
crashrpt -
  1. Только Windows, а у нас как раз готовятся работы по портированию под Linux
  2. Серверную часть придется делать самостоятельно (прием крэш-дампов, статистику и т.д.)
google-breakpad +
  1. Google! Эта библиотека используется в Google Chrome и Mozilla Firefox. Большое сообщество, проект активно развивается
  2. Работает под Windows, Mac, Linux
  3. Интегрируется с сервером Mozilla Soccoro, с помощью которого можно собирать дампы, статистику и т.д.
google-breakpad -
  1. Хуже документирована и даже информацию о том, как скомпилировать библиотеку, нужно искать в wiki, то описание, что идет с исходниками полного объяснения процесса компиляции не дает
  2. Нет GUI
Несмотря на то, что crashrpt очень понравился, выбрал все-таки google-breakpad с расчетом его интеграции с Soccoro.

Для тех, кто тоже захочет использовать 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: