Spec-Zone.ru › MariaDB

Компиляция и использование MariaDB с санитайзерами (ASAN, UBSAN, TSAN, MSAN)

Что такое санитайзеры?

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

AddressSanitizer (также известный как ASAN) — это инструмент для обнаружения ошибок работы с памятью в C/C++. Он находит многие те же проблемы, что и valgrind, но с гораздо меньшей нагрузкой.

  • Использование после освобождения (обращение к висящей ссылке)
  • Переполнение буфера кучи
  • Переполнение буфера стека
  • Переполнение глобального буфера
  • Использование после возврата
  • Использование после выхода из области видимости
  • Ошибки порядка инициализации
  • Утечки памяти

Для использования ASAN вам нужен gcc, поддерживающий ASAN. Известно, что gcc 4.8.5 и выше работают.

Помимо ASAN существуют санитайзеры для ошибок не определённого поведения, ошибок связанных с потоками и памятью.

UndefinedBehaviourSanitizer (также известный как UBSAN)

ThreadSanitizer (также известный как TSAN)

MemorySanitizer (также известный как MSAN)

Как скомпилировать MariaDB с санитайзерами

Перед использованием ASAN локально, убедитесь, что он установлен в системе:

yum install -y /usr/lib64/libasan.so.6.0.0

ASAN поддерживается в MariaDB 10.1 и выше.

Вы можете использовать одну из двух следующих команд сборки:

cmake . -DWITH_ASAN=ON

или с MariaDB 10.2 и выше:

./BUILD/compile-pentium64-asan-max

Кроме того, UBSAN, TSAN и MSAN могут быть включены аналогичным образом:

UBSAN:

yum install -y /usr/lib64/libubsan.so.1.0.0
cmake . -DWITH_UBSAN=ON

TSAN:

yum install -y /usr/lib64/libtsan.so.0.0.0
cmake . -DWITH_TSAN=ON

MSAN:

Примечание: имейте в виду, что только clang поддерживает MSAN, g++ или другие компиляторы не будут работать.

cmake . -DWITH_MSAN=ON

Запуск сборки с MSAN

Время, затраченное на сборку с MSAN, связано с инструментированными системными библиотеками. Поскольку MariaDB Foundation уже создали контейнер MSAN для buildbot, вот как его использовать для локальной сборки.

Сначала запустите контейнер, где текущий каталог является исходным каталогом:

podman run -v $PWD:/source:z -ti --user buildbot --entrypoint bash --shm-size 5G --env MSAN_SYMBOLIZER_PATH=/msan-libs/bin/llvm-symbolizer-msan --env  MSAN_OPTIONS=abort_on_error=1:poison_in_dtor=0 quay.io/mariadb-foundation/bb-worker:debian11-msan

Примечание: вместо более лёгкого podman можно использовать docker.

shm-size предназначен для тестов MTR, которые превышают стандартный размер shm-size в 64k.

Все следующие инструкции выполняются внутри контейнера. Теперь запустите этап конфигурации cmake:

cmake /source -DCMAKE_C_COMPILER=clang-15 -DCMAKE_CXX_COMPILER=clang++-15 '-DCMAKE_C_FLAGS=-O2 -Wno-unused-command-line-argument -fdebug-macro' '-DCMAKE_CXX_FLAGS=-stdlib=libc++ -O2 -Wno-unused-command-line-argument -fdebug-macro' -DWITH_EMBEDDED_SERVER=OFF -DWITH_UNIT_TESTS=OFF -DCMAKE_BUILD_TYPE=Debug -DWITH_INNODB_BZIP2=OFF -DWITH_INNODB_LZ4=OFF -DWITH_INNODB_LZMA=OFF -DWITH_INNODB_LZO=OFF -DWITH_INNODB_SNAPPY=OFF -DPLUGIN_ARCHIVE=NO -DPLUGIN_TOKUDB=NO -DPLUGIN_MROONGA=NO -DPLUGIN_OQGRAPH=NO -DPLUGIN_ROCKSDB=NO -DPLUGIN_CONNECT=NO -DPLUGIN_SPIDER=NO -DWITH_SAFEMALLOC=OFF -DWITH_ZLIB=bundled -DWITH_SSL=bundled -DWITH_PCRE=bundled -DHAVE_LIBAIO_H=0 -DCMAKE_DISABLE_FIND_PACKAGE_URING=1 -DCMAKE_DISABLE_FIND_PACKAGE_LIBAIO=1 -DWITH_MSAN=ON -DWITH_DBUG_TRACE=OFF

Запустите этап сборки:

cmake --build . --parallel 
...
[100%] Built target mariadbd
[100%] Linking CXX executable mariadb-backup
Creating mariabackup link
[100%] Built target mariadb-backup

Поскольку важный этап MTR требует использования инструментированных библиотек, MTR запускается с использованием LD_LIBRARY_PATH для использования этих библиотек.

LD_LIBRARY_PATH=/msan-libs mysql-test/mtr  --mem --big-test --force --retry=0 --skip-test=.*compression.*  --parallel=auto

По мере выхода новых версий и улучшений эти инструкции могут измениться. Обратитесь к выполнению на странице buildbot для проверки изменений.

Запуск сборки с ASAN

Для запуска mysqld с инструментированием необходимо установить переменную среды ASAN_OPTIONS перед запуском mysqld. Либо в вашей оболочке, либо в вашем скрипте mysqld_safe.

export ASAN_OPTIONS=abort_on_error=1

Вышеуказанная команда прервёт любое инструментированное исполняемое приложение при обнаружении ошибок, что полезно для отладки. Если вы установите abort_on_error=0, все ошибки сервера будут записаны в ваш файл журнала ошибок (mysqld.err).

Для отслеживания ошибок для других процессов, кроме сервера, вы можете установить дополнительные параметры, например:

export ASAN_OPTIONS=abort_on_error=1:log_path=/tmp/asan

Если вы видите неполный стек вызовов для выделения памяти, можете повторить неудачный тест с

export ASAN_OPTIONS=abort_on_error=1:log_path=/tmp/asan:fast_unwind_on_malloc=0

Для получения дампов core при ошибках:

export ASAN_OPTIONS=abort_on_error=1:disable_coredump=0

Для просмотра всех параметров (или для проверки, инструментировано ли исполняемое приложение), вы можете попробовать следующее:

ASAN_OPTIONS=help=1 extra/perror 0

Использование Valgrind

Система тестов MariaDB может использовать Valgrind для поиска утечек памяти и неправильного доступа к памяти. Valgrind — это среда инструментирования для построения инструментов динамического анализа. Если Valgrind установлен в вашей системе, вы можете просто использовать mysql-test-run --valgrind для запуска тестов под Valgrind.

См. также

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

© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/compile-and-using-mariadb-with-sanitizers-asan-ubsan-tsan-msan/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API