Перейти к основному содержимому

Поставка сборки с отладочными пакетами

Описание

Для улучшения качества и скорости исследования инцидентов, возникших в промышленной среде, производится поставка отладочных символов. Отладочная информация отделяется от исполняемых/библиотечных объектов и сохраняется в отдельных файлах. Данные файлы поставляются отдельным пакетом (далее отладочным пакетом) с каждым компонентом решения, для которых их поставка предусмотрена.

В корневой каталог дистрибутива продукта добавлена директория debug, содержащая отладочные пакеты всех компонентов, для которых предусмотрена поставка. Скрипты автоматизации установки расширены дополнительными конфигурационными параметрами, позволяющие производить установку отладочных символов в момент установки решения.

Перечень компонентов решения для которых предусмотрена поставка отладочных символов:

  • Серверная часть СУБД (pangolin-dbms);
  • Клиентская часть СУБД (pangolin-dbms-client);
  • Интерфейс программирования libpq (pangolin-dbms-libpq);
  • Компонент Pangolin Pooler (pangolin-pooler);
  • Многопоточный компонент Pangolin Pooler (pangolin-pooler-mt);
  • Компонент Pangolin Manager (pangolin-manager);
  • Утилита резервного копирования (pangolin-backup-tools);
  • Утилита ротации сертификатов (pangolin-certs-rotate);
  • Утилиты настройки безопасности (pangolin-security-utilities).
Сведения

Установка отладочного пакета не оказывает влияния на производительность решения. Принятие решения о моменте установки отладочной информации принимается пользователем.

Установка отладочных пакетов позволяет:

  • получать информативный стек вызовов (с адресами и именами функций);
  • производить рассекречивание дампов памяти процесса (core dump), в том числе сформированных автоматически до момента установки отладочных пакетов;
  • сократить срок расследования инцидентов.

Настройка

Установка отладочных пакетов доступна следующими способами:

Установка отладочных символов производится в стандартную директорию модуля, для которого они собраны, и размещается в одном каталоге с исполняемыми файлами/библиотеками. Отладочная информация собирается только для исполняемых файлов и библиотек.

Сведения

Для корректного сбора информации в момент возникновения инцидента, необходимо произвести дополнительнуюнастройку операционной системы (ОС) для автоматического формирования снимков памяти процесса (core dump) в случае аварийного завершения процесса.

Установка отладочной информации не влияет на процесс создания снимков памяти процесса (core dump) и последующую информативность содержащих в них данных. Однако необходимо, чтобы в момент исследования дампов, отладочные символы были установлены (функциональность позволяет формировать информативный стек вызовов из дампов, сформированных до установки отладочной информации).

Ручная установка отладочных пакетов

Для установки отладочного пакета используйте пакетный менеджер. Далее приведен пример установки отладочного пакета компонента Pangolin Manager.

sudo dnf install pangolin-manager-debuginfo-{version_component}-{OS}.x86_64.rpm

Пример заполненной команды:

sudo dnf install -y ~/distributive/debug/pangolin-manager-debuginfo-2.1.9-sberlinux9.x86_64.rpm

Автоматическая установка отладочных пакетов

Установка отладочных символов компонента происходит автоматически в момент установки компонента при установке соответствующего флага в файле конфигурации скриптов автоматизации.

Имена переменных для установки пакетов debuginfo (пакеты будут установлены в случае флагов в значении true) доступны к заполнению в config.yml на этапе установки СУБД:

setup_debug_symbols:
pangolin_backup_tools: false # Install backup-tools-debuginfo package, contain debug symbols for origin backup-tools package
pangolin_dbms: false # Install dbms-debuginfo package, contain debug symbols for origin dbms-client package
pangolin_dbms_client: false # Install dbms-client-debuginfo package, contain debug symbols for origin dbms-client package
pangolin_manager: false # Install manager-debuginfo package, contain debug symbols for origin manager package
pangolin_pooler: false # Install pooler-debuginfo package, contain debug symbols for origin pooler package
pangolin_pooler_mt: false # Install pooler-mt-debuginfo package, contain debug symbols for origin pooler package
pangolin_certs_rotate: false # Install certs-rotate-debuginfo package, contain debug symbols for origin certs-rotate package
pangolin_security_utilities: false # Install security-utilities-debuginfo package, contain debug symbols for origin security-utilities package

Мета-пакет pangolin-full-debuginfo

Дополнительно реализован мета-пакет pangolin-full-debuginfo, который предполагает установку отладочных символов следующих компонентов:

  • серверная часть СУБД (pangolin-dbms-debuginfo);
  • клиентская часть СУБД (pangolin-dbms-client-debuginfo);
  • компонент Pangolin Pooler (pangolin-pooler-debuginfo);
  • многопоточный компонент Pangolin Pooler (pangolin-pooler-mt-debuginfo);
  • компонент Pangolin Manager (pangolin-manager-debuginfo);
  • утилита резервного копирования (pangolin-backup-tools-debuginfo);
  • утилита ротации сертификатов (pangolin-certs-rotate-debuginfo);
  • утилиты настройки безопасности (pangolin-security-utilities-debuginfo).

Обновление отладочных пакетов

Существует несколько сценариев обновления отладочных символов:

  • Установку отладочных символов при обновлении с версий ниже 6.4.0 пользователь производит вручную (в т.ч. при выполнении обновления средствами скриптов автоматизации) путем запуска установки соответствующего отладочного пакета, хранящегося в дистрибутиве продукта.

  • При выполнении обновления средствами скриптов автоматизации, обновление ранее установленных отладочных символов производится автоматически до версии, аналогичной устанавливаемым модулям, для которых они собраны. Обновление производится в том объеме, в котором отладочные символы были установлены ранее. При этом значения переменных словаря setup_debug_symbols, установленных в config.yml, при обновлении игнорируются и вычисляются на основе ранее установленных пакетов.

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

Управление

Настройка ОС для автоматического формирования core dump

С целью обеспечения автоматического формирования дампа памяти процесса (core dump) средствами операционной системы необходимо выполнить ее дополнительную настройку.

Как правило, выполнения ulimit -c unlimited перед запуском процесса достаточно для включения автоматического формирования снимков памяти (core dump) аварийно завершенного процесса. Однако также рекомендуется выполнить дополнительную настройку имен и путь расположения файлов, для чего перед запуском процесса дополнительно необходимо выполнить:

  1. Добавить в файл /etc/sysctl.conf параметры:

    kernel.core_uses_pid = 1
    kernel.core_pattern = /tmp/core-%e-%s-%p-%t
    fs.suid_dumpable = 2

    где kernel.core_pattern - паттерн расположения и имени core-файла. В имени файла можно использовать следующие %-спецификаторы:

    • %% - один % символ;
    • %p - PID процесса для которого создан файл;
    • %u - UID процесса для которого создан файл;
    • %g - GID процесса для которого создан файл;
    • %s - номер сигнала повлекшего создание файла;
    • %t - время создание файла (количество секунд с 00:00 1 января 1970 года);
    • %h - имя узла;
    • %e - имя исполняемого файла.
  2. Перезагрузить настройки в /etc/sysctl.conf, выполнив команду:

    sudo sysctl -p

Формирование стека вызова из core-файлов

При возникновении инцидента с генерацией снимка памяти процесса (core dump) необходимо самостоятельно или с привлечением службы технической поддержи сформировать информативный стек вызовов в текстовом формате для его дальнейшего передачи разработчикам.

Под информативным стеком вызовов понимается стек с именами внутренних функций.

Пример неинформативного стека вызовов:

#0  0x00007fbc791d1b6f in ?? ()
#1 0x000000000080ef62 in ?? ()
#2 0x0000000000811070 in ?? ()
#3 0x000000000055cb93 in ?? ()

Пример максимально информативного стека вызовов:

#0  0x00007efe1d229b6f in select () from /lib64/libc.so.6
#1 0x0000000000811192 in ServerLoop ()
#2 0x0000000000813013 in PostmasterMain ()
#3 0x000000000055f0f3 in main ()
Примечание

Отладочные пакеты компонентов решения не включают символы ряда используемых библиотек (не включенных в поставку), библиотек операционной системы (ОС), файлов ядра ОС.

При возникновении потребности в данных символах пользователь производит их поиск и установку самостоятельно.

Перед началом работ по получению стека вызовов из core-файла необходимо убедиться, что отладочные символы установлены.

Для формирования стека вызовов:

  1. Запустите gdb с передачей имени исполняемого файла (для которого сформирован core-файл) и имя core-файла. Пример:

    gdb /opt/pangolin-dbms-server-{short_version}/bin/postgres /tmp/core-postgres-6-1550075-1727167676
  2. В интерактивном режиме gdb выполните команду для формирования трассы вызовов:

    (gdb) bt

Определение исполняемого файла для которого сформирован core-файл

Сore-файл содержит информацию об исполняемом файле, для которого он был сформирован. Для получения этой информации достаточно запустить gdb с передачей только core-файла. В момент загрузки файла gdb выведет информацию. Пример подобного вывода:

Core was generated by `/opt/pangolin-dbms-server/bin/postgres -D /pgdata/0<base_version>/data'.

Где /opt/pangolin-dbms-server/bin/postgres - имя исполняемого файла и путь к нему.

Наименование пакетов с отладочной информацией

Наименование пакетов, содержащих отладочную информация, совпадают с именами оригинальных пакетов и добавлением постфикса: -debuginfo. Например, оригинальный пакет: pangolin-dbms-x.x. Пакет с отладочной информацией: pangolin-dbms-x.x-debuginfo.

Наименование файлов, содержащих отладочную информацию

Наименование файлов, содержащих отладочные символы для исполняемых объектов, совпадают с именами файлов, для которых они собраны с добавлением суффикса: .debug. Пути расположения отладочных файлов полностью совпадают с путями расположения исполняемых файлов, для которых они были созданы.

Например, отладочный файл для /opt/pangolin-dbms-server/bin/postgres будет назван /opt/pangolin-dbms-server/bin/postgres.debug.

Сценарии использования

Установки отладочного пакета после установки пакета с исполняемыми файлами

  1. Выполните установку пакета pangolin-dbms-{short_version}-{product_version}-{OS}.x86_64.rpm версии не ниже 6.4.0.

  2. Выполните установку отладочного пакета pangolin-dbms-{short_version}-debuginfo-{product_version}-{OS}.x86_64.rpm.

  3. Проверьте установку пакета, содержащего исполняемые файлы. Например, при установке через rpm (sudo rpm -i ...):

    rpm -q pangolin-dbms-{short_version}

    Ожидаемый результат: Вывод для приведенной команды:

    pangolin-dbms-{short_version}-{product_version}-{OS}.x86_64
  4. Проверьте установку отладочного пакета. Например,при установке через rpm (sudo rpm -i ...):

    rpm -q pangolin-dbms-{short_version}-debuginfo

    Ожидаемый результат: Вывод для приведенной команды:

    pangolin-dbms-{short_version}-debuginfo-{product_version}-{OS}.x86_64
  5. Проверьте наличие файлов с отладочными символами в директории /opt/pangolin-dbms-server-{short_version}/bin, для этого выполните команду:

    sudo find /opt/pangolin-dbms-server-{short_version}/bin/ -name "*.debug"

    Ожидаемый результат: Пример вывода команды:

    /opt/pangolin-dbms-server-{short_version}/bin/trace_decode.debug
    /opt/pangolin-dbms-server-{short_version}/bin/pg_test_fsync.debug
  6. Проверьте наличие файлов с отладочными символами в директории /opt/pangolin-dbms-server-{short_version}/lib, для этого выполните команду:

    sudo find /opt/pangolin-dbms-server-{short_version}/lib/ -name "*.debug"

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

    /opt/pangolin-dbms-server-{short_version}/lib/pgcrypto.so.debug
    /opt/pangolin-dbms-server-{short_version}/lib/fasttrun.so.debug

Настройки автоматической генерации core-файлов

  1. Выполните настройку ОС для автоматического формирования core дамп.

  2. Выполните установку пакета pangolin-dbms-{short_version}-{product_version}-{OS}.x86_64.rpm.

  3. Создайте служебные каталоги БД для пользователя postgres, выполнив последовательно команды:

    sudo mkdir -p /pgdata/0<base_version>/data
    sudo chown -R postgres:postgres /pgdata/0<base_version>/
    sudo mkdir /pgerrorlogs
    sudo chown postgres:postgres /pgerrorlogs/
  4. Смените текущего пользователя на пользователя postgres:

    sudo su - postgres
  5. Проинициализируйте каталоги БД, выполнив команду:

    initdb -k -D /pgdata/0<base_version>/data/

    Ожидаемый результат: Инициализация выполнена успешно (отсутствуют сообщения об ошибках в процессе работы утилиты initdb), пример вывода:

    The files belonging to this database system will be owned by user "postgres".
    This user must also own the server process.

    The database cluster will be initialized with locale "en_US.utf8".
    The default database encoding has accordingly been set to "UTF8".
    The default text search configuration will be set to "english".

    Data page checksums are enabled.

    fixing permissions on existing directory /pgdata/0<base_version>/data ... ok
    creating subdirectories ... ok
    selecting dynamic shared memory implementation ... posix
    selecting default max_connections ...
    "/opt/pangolin-dbms-server/bin/postgres" --check -F -c log_checkpoints=false -c is_initdb=true -c max_connections=100 -c shared_buffers=1000 -c dynamic_shared_memory_type=posix < "/dev/null" > "/dev/null" 2>&1
    100
    selecting default shared_buffers ... 128MB
    selecting default time zone ... Europe/Moscow
    creating configuration files ... ok
    running bootstrap script ... ok
    performing post-bootstrap initialization ... ok
    syncing data to disk ... ok

    initdb: warning: enabling "trust" authentication for local connections
    initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb.

    Success. You can now start the database server using:

    pg_ctl -D /pgdata/0<base_version>/data/ -l logfile start
  6. Запустите сервер PostgreSQL:

    pg_ctl -D /pgdata/0<base_version>/data/ -l /pgerrorlogs/postgresql.log start

    Ожидаемый результат: Сервер PostgreSQL запущен, пример вывода:

    waiting for server to start.... done
    server started
  7. Получите PID запущенного процесса сервера запуском команды:

    ps -aux | grep pangolin

    Ожидаемый результат: PID процесса сервера СУБД получен. Пример вывода команды:

    postgres 1549833  0.0  0.3 603844 39612 ?        Ss   11:37   0:00 /opt/pangolin-dbms-server/bin/postgres -D /pgdata/0<base_version>/data
    postgres 1549868 0.0 0.0 221940 1200 pts/1 S+ 11:40 0:00 grep --color=auto pangolin

    Где 1549833 - PID запущенного процесса сервера СУБД.

  8. Завершите процесс сервера путем вызова команды:

    kill -ABRT <PID_SERV_PROC>

    Где <PID_SERV_PROC> – идентификатор запущенного процесса сервера (полученный на предыдущем шаге).

    Ожидаемый результат: Сформирован core-файл, имя и расположение которого соответствуют паттерну, указанному для параметра kernel.core_pattern в файле /etc/sysctl.conf.

    Пример для приведенных настроек:

    ls /tmp/core*

    /tmp/core-postgres-6-1549833-1727167676

Вывод стека вызова работающего процесса»

  1. Выполните установку пакета pangolin-dbms-{short_version}-{product_version}-{OS}.x86_64.rpm версии не ниже 6.4.0.

  2. Выполните установку отладочного пакета pangolin-dbms-{short_version}-debuginfo-{product_version}-{OS}.x86_64.rpm для установленной на предыдущем шаге версии.

  3. Создайте служебные каталоги БД для пользователя postgres, выполнив команды:

    sudo mkdir -p /pgdata/0<base_version>/data
    sudo chown -R postgres:postgres /pgdata/0<base_version>/
    sudo mkdir /pgerrorlogs
    sudo chown postgres:postgres /pgerrorlogs/
  4. Смените текущего пользователя на пользователя postgres:

    sudo su - postgres
  5. Проинициализируйте каталоги БД, выполнив:

    initdb -k -D /pgdata/0<base_version>/data/

    Ожидаемый результат: Инициализация выполнена успешно (отсутствуют сообщения об ошибках в процессе работы утилиты initdb).

  6. Выполните запуск сервера PostgreSQL:

    pg_ctl -D /pgdata/0<base_version>/data/ -l /pgerrorlogs/postgresql.log start

    Ожидаемый результат: Сервер PostgreSQL запущен:

    waiting for server to start.... done
    server started
  7. Получите PID запущенного процесса сервера:

    ps -aux | grep pangolin

    Ожидаемый результат: PID процесса сервера PostgreSQL получен. Пример вывода:

    postgres 1549833  0.0  0.3 603844 39612 ?        Ss   11:37   0:00 /opt/pangolin-dbms-server/bin/postgres -D /pgdata/0<base_version>/data
    postgres 1549868 0.0 0.0 221940 1200 pts/1 S+ 11:40 0:00 grep --color=auto pangolin
  8. Подключитесь к процессу сервера утилитой pstack:

    pstack <PID_SERV_PROC>

    Где <PID_SERV_PROC> - идентификатор запущенного процесса сервера (полученный на предыдущем шаге).

    Ожидаемый результат: Утилита pstack успешно подключилась к процессу и вывела информативный стек вызовов (содержащий имена вызванных функций). Пример вывода:

    #0  0x00007fee61b71b6f in select () from /lib64/libc.so.6
    #1 0x0000000000811192 in ServerLoop ()
    #2 0x0000000000813013 in PostmasterMain ()
    #3 0x000000000055f0f3 in main ()