# Crashpad

Библиотека для сбора, обработки и отправки отчётов об авариях (crash reports), разработанная Google. Она предоставляет надежный механизм для захвата дампов памяти при сбоях приложений, их локального хранения и передачи на серверы для последующего анализа. Библиотека широко используется в крупных проектах для мониторинга стабильности и диагностики проблем в production-среде.

## Особенности

- надежный захват дампов памяти при критических сбоях (крашах) и необработанных исключениях;
- поддержка основных платформ: Windows, macOS, Linux, Android, iOS;
- интеграция с существующими системами обработки ошибок (например, Google Breakpad);
- возможность добавления пользовательских метаданных и аннотаций в отчёты;
- настраиваемая политика отправки отчётов (немедленно, отложенно, по требованию);
- минимальное влияние на производительность работающего приложения.

## Основные компоненты

Crashpad состоит из нескольких модулей, которые обеспечивают полный цикл обработки аварийных ситуаций — от момента сбоя до передачи отчёта на сервер (подробнее с документацией можно ознакомиться [здесь](https://chromium.googlesource.com/crashpad/crashpad/+/main/README.md)).

### Захват и создание дампов

Основная функция Crashpad — перехват сбоев и создание детализированных дампов памяти, которые содержат информацию о состоянии процесса на момент аварии. Библиотека использует низкоуровневые механизмы операционной системы для обеспечения максимальной надежности захвата.

Ключевые компоненты захвата:

- `crashpad::CrashpadClient` — основной клиент для инициализации и управления захватом сбоев;
- обработчики исключений для различных платформ (SEH на Windows, Mach исключения на macOS, сигналы на Linux/Android);
- создание минидампов (minidumps) с информацией о потоках, стеках, памяти и загруженных модулях;
- поддержка захвата сбоев в отдельных процессах через `crashpad::Handler`.

### Обработка и хранение отчётов

После захвата дампа Crashpad обрабатывает его, добавляет пользовательские метаданные и сохраняет в локальном хранилище. Библиотека обеспечивает целостность данных даже в условиях неожиданных сбоев системы.

Функции обработки и хранения:

- `crashpad::CrashReportDatabase` — база данных для управления отчётами об авариях;
- добавление аннотаций (ключ-значение) для контекстуализации сбоев;
- прикрепление пользовательских файлов и потоков данных к отчётам;
- сжатие и шифрование отчётов для экономии дискового пространства и безопасности;
- ротация и очистка устаревших отчётов по настраиваемым правилам.

### Отправка отчётов на сервер

Crashpad предоставляет механизмы для передачи собранных отчётов на серверы разработчиков. Поддерживаются различные протоколы и стратегии отправки, включая отложенную передачу при отсутствии сети.

Компоненты отправки:

- `crashpad::HTTPTransport` — абстракция для HTTP-запросов, используемая для отправки отчётов;
- поддержка протоколов upload символов (symupload) и отчётов (report upload);
- настраиваемые политики повторных попыток и тайм-аутов;
- возможность пакетной отправки нескольких отчётов;
- интеграция с системами аутентификации и прокси.

### Интеграция с системами символов

Для корректного анализа дампов памяти Crashpad поддерживает работу с файлами символов (debug symbols), которые позволяют сопоставлять адреса памяти с именами функций и исходным кодом.

Работа с символами:

- генерация файлов символов (.sym) из бинарных файлов;
- загрузка символов на сервер для последующего анализа;
- поддержка различных форматов символов (Breakpad, DWARF, PDB);
- инструменты для автоматического управления символами в пайплайне сборки.

### Мониторинг и управление

Crashpad предоставляет API для мониторинга состояния системы отчетности и управления её поведением во время выполнения приложения.

Функции мониторинга и управления:

- `crashpad::Settings` — настройки поведения библиотеки (автоматическая отправка, размер хранилища и др.);
- сбор статистики по сбоям и успешным отправкам;
- callback-и для уведомления приложения о событиях (например, об успешной отправке отчёта);
- возможность принудительной генерации дампа для диагностических целей.

### Инструменты разработки и утилиты

В состав Crashpad входят вспомогательные инструменты для разработки, тестирования и отладки системы отчетности об авариях.

Вспомогательные инструменты:

- `crashpad_handler` — отдельный процесс-обработчик сбоев (рекомендуемый способ использования);
- `crashpad_database_util` — утилита для просмотра и управления локальной базой отчётов;
- `crashpad_http_upload` — инструмент для тестирования отправки отчётов;
- интеграция с отладчиками (GDB, LLDB) для автоматического анализа дампов.
