Когда нативное приложение на C или C++ дает сбой на устройстве пользователя, вы часто имеете ограниченное представление о том, что стало причиной ошибки. Трассировка стека может определить затронутый код, но она не показывает, что пользователь делал до сбоя или сталкивались ли другие пользователи с той же проблемой. Без этого контекста вам может потребоваться восстанавливать события, предшествовавшие сбою, или воспроизводить проблему локально в среде, которая может не совпадать с устройством пользователя.
Datadog C++ SDK теперь расширяет возможности Datadog Real User Monitoring (RUM) на нативные приложения на C и C++, работающие под управлением Windows, macOS и Linux. SDK собирает диагностику сбоев, отслеживает ошибки и фиксирует инструментированную активность пользователей, помогая устранять неполадки в контексте тех пользовательских сеансов, в которых они произошли.
В этой статье мы рассмотрим, как:
- Перехватывайте и устраняйте сбои в нативных C и C++ приложениях
Перехватывайте и устраняйте сбои в нативных C и C++ приложениях
- Отслеживайте активность пользователей с помощью контекста сеансов RUM
Отслеживайте активность пользователей с помощью контекста сеансов RUM
- Интегрируйте RUM в нативные C и C++ приложения
Интегрируйте RUM в нативные C и C++ приложения
Перехватывайте и устраняйте сбои в нативных C и C++ приложениях
SDK поддерживает отчеты о нативных сбоях и отслеживание ошибок (Error Tracking), чтобы помочь вам диагностировать необработанные сбои. В Linux и macOS он перехватывает такие сигналы, как SIGSEGV (ошибки сегментации) и SIGABRT (аварийное завершение), а в Windows — необработанные структурные исключения. Полученные отчеты о сбоях включают трассировку стека, которая помогает определить, где произошел сбой и чем он был вызван.
Допустим, настольное приложение зависает или падает, когда пользователь открывает сохраненный документ. С помощью SDK вы можете изучить полученный отчет о сбое и его трассировку стека. При загрузке отладочных символов символизация преобразует адреса трассировки стека в понятные человеку имена функций и строки исходного кода, что помогает точно определить проблемный участок в коде.
Выберите обработчик сбоев для вашего приложения
SDK предлагает два обработчика сбоев:
- Внутрипроцессный обработчик, который фиксирует сбои внутри самого приложения
Внутрипроцессный обработчик, который фиксирует сбои внутри самого приложения
- Внепроцессный обработчик, который собирает более подробную диагностику сбоев
Внепроцессный обработчик, который собирает более подробную диагностику сбоев
Внутрипроцессный обработчик сбоев требует только C++17 и не нуждается в дополнительных исполняемых файлах. Он записывает трассировку стека потока, в котором произошел сбой, и отправляет отчет при следующем запуске приложения.
Внепроцессный обработчик сбоев использует Crashpad, систему отчетности о сбоях с открытым исходным кодом, применяемую в Chromium. Поскольку Crashpad работает как отдельный процесс crashpad_handler, он способен фиксировать такие проблемы, как переполнение стека и повреждение кучи, которые внутрипроцессный обработчик может пропустить. Он также сохраняет трассировку стека всех потоков и отправляет отчеты о сбоях немедленно, не дожидаясь перезапуска приложения.
Оба обработчика сбоев передают ошибки RUM, дополненные актуальным контекстом RUM на момент сбоя, включая сеанс и последнее активное представление. Вы можете использовать этот контекст для исследования сбоев наряду с остальными данными сеанса в системе отслеживания ошибок (Error Tracking). Временная шкала сеанса RUM также позволяет просмотреть действия пользователя, загрузки представлений и сетевые запросы, предшествовавшие сбою, что поможет восстановить картину произошедшего перед тем, как приложение завершилось с ошибкой.
Выявляйте повторяющиеся сбои и отслеживайте обработанные ошибки
Система отслеживания ошибок (Error Tracking) группирует связанные проблемы в инциденты, позволяя выявлять повторяющиеся сбои, отличать единичные неполадки от масштабных и расставлять приоритеты расследования в зависимости от влияния на пользователей и сеансы.
SDK также позволяет сообщать об обработанных ошибках, которые не приводят к аварийному завершению приложения. Например, настольному приложению не удалось десериализовать сохраненный файл, или нативный клиент получил неожиданный ответ при обработке данных. Связывание этих ошибок с сеансами RUM позволяет исследовать проблемы, затрагивающие пользователей, даже если приложение продолжает работу.
Отслеживайте активность пользователей с помощью контекста сеансов RUM
Поскольку SDK не привязан к конкретному UI-фреймворку, вы самостоятельно определяете события, отражающие взаимодействие пользователей с вашим приложением, а SDK связывает их с сеансами RUM. Например, вы можете настроить инструментирование настольного приложения для сбора следующих данных:
- Представления: Экраны или состояния приложения, такие как редактор документов, страница настроек или файловый менеджер
Представления: Экраны или состояния приложения, такие как редактор документов, страница настроек или файловый менеджер
- Действия: Пользовательские взаимодействия, такие как выбор файла, нажатие кнопки или запуск экспорта
Действия: Пользовательские взаимодействия, такие как выбор файла, нажатие кнопки или запуск экспорта
- Ресурсы: Сетевые запросы и их результаты, включая тайм-ауты и другие сбои
Ресурсы: Сетевые запросы и их результаты, включая тайм-ауты и другие сбои
- Операции: Многоэтапные рабочие процессы, такие как открытие документа, аутентификация пользователя или выгрузка файла
Операции: Многоэтапные рабочие процессы, такие как открытие документа, аутентификация пользователя или выгрузка файла
- Длительные задачи: Задержки, блокирующие основной поток на длительное время, например, если обновление кадра или обработчик событий превышают допустимый лимит времени
Длительные задачи: Задержки, блокирующие основной поток на длительное время, например, если обновление кадра или обработчик событий превышают допустимый лимит времени
Если пользователь сталкивается с ошибкой при открытии документа, вы можете увидеть представление, на котором он находился, действие, запустившее рабочий процесс, и любые связанные сбои ресурсов. Операции RUM также позволяют отслеживать, успешно ли открывается документ и сколько времени требуется на загрузку его содержимого и подготовку к редактированию.
Интегрируйте RUM в нативные C и C++ приложения
SDK предоставляет C++ API для кодовых баз, ориентированных на C++17 и выше, а также совместимый с C99 C API. Оба варианта работают со стандартными средами сборки, включая проекты на базе CMake. Вы также можете обернуть C API в привязки внешнего интерфейса функций (FFI) для инструментирования приложений, написанных на других языках и рантаймах.
SDK отправляет данные RUM напрямую в Datadog, не требуя установки агента Datadog на устройство каждого пользователя. Например, вы можете инструментировать ПК-игру для сбора информации о представлениях, действиях пользователей, ошибках и операциях вроде загрузки уровня или подключения к игровому серверу. После этого вы сможете исследовать сбои в RUM без использования плагина, специфичного для вашего игрового движка.
SDK также включает элементы управления соглашением об отслеживании, позволяющие управлять локальным хранилищем и отправкой данных RUM в соответствии с предпочтениями согласия каждого пользователя.
Начните мониторинг нативных приложений с помощью Datadog RUM
Чтобы начать мониторинг вашего нативного C или C++ приложения, выполните инструментирование наиболее важных для пользователей рабочих процессов и настройте отправку отчетов о сбоях для сбора диагностической информации при возникновении неполадок.
Информацию по настройке см. в документации по настройке C++ SDK и в репозитории open source C++ SDK на GitHub.
Если вы еще не являетесь клиентом Datadog, зарегистрируйтесь для получения бесплатной 14-дневной пробной версии, чтобы начать мониторинг нативных C и C++ приложений с помощью Datadog RUM.










