Минидампы (встроенный Google Breakpad)

Узлы ydbd в YDB могут собирать минидампы при аварийном завершении процесса с помощью встроенного Google Breakpad. Минидамп — это компактный снимок состояния процесса (стек, регистры, список загруженных модулей) в момент падения по необработанному сигналу (SIGSEGV, SIGABRT, SIGFPE и другим).

В отличие от системного core dump, минидамп:

  • занимает существенно меньше места;
  • собирается собственным обработчиком сигналов и не зависит от настроек ulimit и core_pattern на хосте;
  • может автоматически передаваться внешнему скрипту для пост-обработки (загрузки, символизации, оповещения).

Примечание

Сбор минидампов работает только на Linux. На других платформах (например, macOS) ydbd запускается, но встроенный Breakpad в сборку не входит и минидампы не собираются.

Включение сбора минидампов

По умолчанию сбор минидампов выключен. Чтобы включить его, нужно указать директорию, в которую будут записываться дампы. Это можно сделать двумя способами: переменными окружения и опциями командной строки ydbd server. Опции командной строки имеют приоритет над переменными окружения.

Если директория не задана ни одним из способов, встроенный Breakpad не активируется и не устанавливает обработчики сигналов.

Примечание

Указанная директория должна существовать до запуска процесса; YDB не создаёт её автоматически. Если директория отсутствует в момент падения, минидамп не будет записан.

Переменные окружения

Переменная Назначение
BREAKPAD_MINIDUMPS_PATH директория для записи минидампов; задание этой переменной включает сбор минидампов при старте процесса
BREAKPAD_MINIDUMPS_SCRIPT путь к скрипту пост-обработки минидампа

Опции командной строки

Опции добавляются к команде ydbd server:

Опция Назначение
--breakpad-minidumps-path PATH директория для записи минидампов
--breakpad-minidumps-script SCRIPT путь к скрипту пост-обработки минидампа

Пример запуска:

ydbd server \
    --breakpad-minidumps-path /var/log/ydb/minidumps \
    --breakpad-minidumps-script /usr/local/bin/process-minidump.sh \
    ...

Скрипт пост-обработки

Если задан скрипт пост-обработки, он запускается сразу после записи минидампа. Скрипт вызывается со следующими аргументами:

Аргумент Значение
$1 true или false — был ли минидамп успешно записан
$2 путь к файлу минидампа (пустая строка, если запись не удалась)

Скрипту не передаётся окружение процесса ydbd, поэтому все необходимые ему параметры должны быть зашиты в самом скрипте или вычисляться из аргументов.

Важно

Скрипт запускается из обработчика сигнала упавшего процесса через fork/exec. Обработчик сигнала блокируется до завершения скрипта, поэтому скрипт должен завершаться быстро. Тяжёлую обработку (загрузку дампа, символизацию, оповещения) следует выносить в фоновые процессы, которые скрипт запускает перед выходом.

Пример скрипта, который только перемещает дамп в архивную директорию:

#!/bin/sh
# $1 — succeeded (true|false), $2 — путь к минидампу
if [ "$1" = "true" ]; then
    mv "$2" /var/log/ydb/minidumps/archive/
fi

Анализ минидампов

Минидамп не содержит символов: для получения читаемого стека нужны символы того же сборочного артефакта ydbd. Для разбора используются штатные инструменты Google Breakpad (minidump_stackwalk и .sym-файлы), полученные из символов соответствующей сборки.

См. также