Использование Breakpad для создания аварийных дампов с помощью WPE WebKit


Введение и обзор BreakPad

Breakpad — это инструмент от Google, который помогает генерировать отчеты о сбоях. Из его описания:

Breakpad — это библиотека и набор инструментов, которые позволяют распространять приложение среди пользователей с удаленной отладочной информацией, предоставленной компилятором, записывать сбои в компактные файлы «minidump», отправлять их обратно на ваш сервер и создавать трассировку стека на C и C++ из этих minidump’ов. Breakpad также может писать минидампы по запросу для программ, которые не потерпели крах.

Он работает путем удаления отладочной информации из исполняемого файла и сохранения ее в «символьных файлах». Когда происходит сбой или по запросу, клиентская библиотека Breakpad генерирует информацию о сбое в этих «минидампах». Процессор минидампов Breakpad объединяет эти файлы с файлами символов и генерирует человекочитаемую трассировку стека. На следующем рисунке, также взятом из документации Breakpad, описан этот процесс:

В WPE поддержка Breakpad была добавлена Вивеком Арумугамом (Vivek Arumugam) первоначально для ветки 2.28, расположенной ниже по течению, а затем перенесена вверх по течению. Она будет доступна в скоро выходящей версии 2.38, а WebKit Flatpak SDK включает клиентскую библиотеку Breakpad с конца мая 2022 года.

Включение Breakpad в WebKit

Как функция для разработчиков, поддержка Breakpad отключена по умолчанию, но может быть включена путем передачи -DENABLE_BREAKPAD=1 в cmake при сборке WebKit. Опционально, вы также можете задать -DBREAKPAD_MINIDUMP_DIR=<some path> для жесткого указания пути, используемого Breakpad для сохранения минидампов. Если она не задана во время сборки, BREAKPAD_MINIDUMP_DIR должна быть установлена как переменная окружения, указывающая на действительный каталог при запуске приложения. Если эта переменная определена, она также отменяет путь, определенный во время сборки.

Генерация символов

Для генерации файлов символов Breakpad предоставляет инструмент dump_syms. Он принимает путь к исполняемому файлу/библиотеке и сбрасывает в stdout информацию о символах.

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

$ dump_syms WebKitBuild/WPE/Release/lib/libWPEWebKit-1.1.so > libWPEWebKit-1.1.so.0.sym
$ head -n 1 libWPEWebKit-1.1.so.0.sym
MODULE Linux x86_64 A2DA230C159B97DC00000000000000000 libWPEWebKit-1.1.so.0
$ mkdir -p ./symbols/libWPEWebKit-1.1.so.0/A2DA230C159B97DC00000000000000000
$ cp libWPEWebKit-1.1.so.0.sym ./symbols/libWPEWebKit-1.1.so.0/A2DA230C159B97DC00000000000000000/
Войти в полноэкранный режим Выход из полноэкранного режима

Генерация журнала аварийных ситуаций

Кроме файлов символов, нам нужен файл минидампа с информацией о стеке, который может быть сгенерирован двумя способами. Во-первых, попросив Breakpad создать его. Другой способ — когда приложение падает 🙂

Чтобы сгенерировать минидамп вручную, вы можете либо вызвать google_breakpad::WriteMiniDump(path, callback, context), либо послать один из сигналов краха, которые Breakpad распознает. Первый способ полезен для программной генерации дампов в определенные моменты, в то время как сигнальный подход может быть полезен для проверки зависших процессов. Именно эти сигналы Breakpad распознает как аварийные:

  • SIGSEGV
  • SIGABRT
  • SIGFPE
  • SIGBUS
  • SIGTRAP

Итак, сначала мы должны запустить Cog:

$ BREAKPAD_MINIDUMP_DIR=/home/lauro/minidumps ./Tools/Scripts/run-minibrowser --wpe --release https://www.wpewebkit.org
Войти в полноэкранный режим Выйти из полноэкранного режима

Разрушение WebProcess с помощью SIGTRAP:

$ ps aux | grep WebProcess
<SOME-PID> ... /app/webkit/.../WebProcess
$ kill -TRAP <SOME-PID>
$ ls /home/lauro/minidumps
5c2d93f2-6e9f-48cf-6f3972ac-b3619fa9.dmp
$ file ~/minidumps/5c2d93f2-6e9f-48cf-6f3972ac-b3619fa9.dmp
/home/lauro/minidumps/5c2d93f2-6e9f-48cf-6f3972ac-b3619fa9.dmp: Mini DuMP crash report, 13 streams, Thu Aug 25 20:29:11 2022, 0 type
Войти в полноэкранный режим Выход из полноэкранного режима

Примечание: В текущей форме WebKit поддерживает дампы Breakpad в WebProcess и NetworkProcess, которые WebKit порождает сам. Разработчик должен вручную добавить его поддержку в UIProcess (браузер/приложение, использующее WebKit). Обработчик исключений должен быть установлен как можно раньше, и многие программы могут выполнить некоторую инициализацию до инициализации самого WebKit.

Перевод журнала аварийных ситуаций

После того как у нас есть журнал аварий .dmp и файлы символов, мы можем использовать minidump_stackwalk для отображения журнала аварий в человекочитаемом виде:

$ minidump_stackwalk ~/minidumps/5c2d93f2-6e9f-48cf-6f3972ac-b3619fa9.dmp ./symbols/
<snip long header>
Operating system: Linux
                  0.0.0 Linux 5.15.0-46-generic #49-Ubuntu SMP Thu Aug 4 18:03:25 UTC 2022 x86_64
CPU: amd64
     family 23 model 113 stepping 0
     1 CPU

GPU: UNKNOWN

Crash reason:  SIGTRAP
Crash address: 0x3e800000000
Process uptime: not available

Thread 0 (crashed)
 0  libc.so.6 + 0xf71fd
    rax = 0xfffffffffffffffc   rdx = 0x0000000000000090
    rcx = 0x00007f6ae47d61fd   rbx = 0x00007f6ae4f0c2e0
    rsi = 0x0000000000000001   rdi = 0x000056187adbf6d0
    rbp = 0x00007fffa9268f10   rsp = 0x00007fffa9268ef0
     r8 = 0x0000000000000000    r9 = 0x00007f6ae4fdc2c0
    r10 = 0x00007fffa9333080   r11 = 0x0000000000000293
    r12 = 0x0000000000000001   r13 = 0x00007fffa9268f34
    r14 = 0x0000000000000090   r15 = 0x000056187ade7aa0
    rip = 0x00007f6ae47d61fd
    Found by: given as instruction pointer in context
 1  libglib-2.0.so.0 + 0x585ce
    rsp = 0x00007fffa9268f20   rip = 0x00007f6ae4efc5ce
    Found by: stack scanning
 2  libglib-2.0.so.0 + 0x58943
    rsp = 0x00007fffa9268f80   rip = 0x00007f6ae4efc943
    Found by: stack scanning
 3  libWPEWebKit-1.1.so.0!WTF::RunLoop::run() + 0x120
    rsp = 0x00007fffa9268fa0   rip = 0x00007f6ae8923180
    Found by: stack scanning
 4  libWPEWebKit-1.1.so.0!WebKit::WebProcessMain(int, char**) + 0x11e
    rbx = 0x000056187a5428d0   rbp = 0x0000000000000003
    rsp = 0x00007fffa9268fd0   r12 = 0x00007fffa9269148
    rip = 0x00007f6ae74719fe
    Found by: call frame info
<snip remaining trace>
Войти в полноэкранный режим Выход из полноэкранного режима

Заключительные слова

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

o/

Оцените статью
devanswers.ru
Добавить комментарий