Spec-Zone.ru › SQLite

Подсказки по отладке

Ниже приведена случайная подборка методов, которые разработчики SQLite используют для отслеживания, изучения и понимания поведения основной библиотеки SQLite.

Эти методы предназначены для помощи в понимании самой основной библиотеки SQLite, а не приложений, которые лишь используют SQLite.

  1. Используйте параметр ".eqp full" в оболочке командной строки

    Если у вас есть сценарий SQL, который вы отлаживаете или пытаетесь понять, часто бывает полезно запустить его в оболочке командной строки с настройкой ".eqp full". Когда для ".eqp" задано значение FULL, оболочка автоматически выводит результаты EXPLAIN и EXPLAIN QUERY PLAN для каждой команды перед её фактическим выполнением.

    Для большей наглядности также задайте ".echo on", чтобы в выводе отображался исходный текст SQL.

    Более новая команда ".eqp trace" делает всё то же, что и ".eqp full", а также включает трассировку VDBE.

  2. Используйте параметры времени компиляции для включения средств отладки.

    Рекомендуемые параметры времени компиляции:

    • -DSQLITE_DEBUG
    • -DSQLITE_ENABLE_EXPLAIN_COMMENTS
    • -DSQLITE_ENABLE_TREETRACE
    • -DSQLITE_ENABLE_WHERETRACE
  3. Параметры SQLITE_ENABLE_TREETRACE и SQLITE_ENABLE_WHERETRACE не описаны в документе о параметрах времени компиляции, поскольку официально не поддерживаются. Они активируют команды оболочки ".treetrace" и ".wheretrace", которые выводят низкоуровневую трассировочную информацию о логике генерации кода для операторов SELECT и DML, а также для предложений WHERE соответственно.

  4. Вызывайте sqlite3ShowExpr() и аналогичные функции из отладчика.

    При компиляции с SQLITE_DEBUG SQLite включает процедуры, выводящие различные внутренние структуры абстрактного синтаксического дерева в виде ASCII-графики. Эти процедуры могут быть полезны при отладке для понимания переменных, с которыми работает SQLite. Доступны следующие процедуры:

    • void sqlite3ShowExpr(const Expr*);
    • void sqlite3ShowExprList(const ExprList*);
    • void sqlite3ShowIdList(const IdList*);
    • void sqlite3ShowSrcList(const SrcList*);
    • void sqlite3ShowSelect(const Select*);
    • void sqlite3ShowWith(const With*);
    • void sqlite3ShowUpsert(const Upsert*);
    • void sqlite3ShowTrigger(const Trigger*);
    • void sqlite3ShowTriggerList(const Trigger*);
    • void sqlite3ShowTriggerStep(const TriggerStep*);
    • void sqlite3ShowTriggerStepList(const TriggerStep*);
    • void sqlite3ShowWindow(const Window*);
    • void sqlite3ShowWinFunc(const Window*);

    Эти процедуры не являются API и могут измениться. Они предназначены только для интерактивной отладки.

  5. Точки останова в test_addoptrace

    При отладке генератора байт-кода часто бывает полезно узнать, где генерируется конкретный код операции. Это легко выяснить, запустив сценарий в отладчике. Установите точку останова на процедуре "test_addoptrace". Затем выполните "PRAGMA vdbe_addoptrace=ON;", а после него — нужный оператор SQL. Каждый код операции будет отображаться при добавлении в программу VDBE, и сразу после этого сработает точка останова. Выполняйте программу пошагово до нужного кода операции, затем просмотрите стек вызовов, чтобы узнать, где и как он был сгенерирован.

    Это работает только при компиляции с SQLITE_DEBUG.

  6. Использование команд оболочки ".treetrace" и ".wheretrace"

    Если оболочка командной строки и основная библиотека SQLite скомпилированы с SQLITE_DEBUG, SQLITE_ENABLE_TREETRACE и SQLITE_ENABLE_WHERETRACE, то в оболочке доступны две команды для включения средств отладки самых сложных частей генератора кода — логики обработки операторов SELECT и предложений WHERE соответственно. Команды ".treetrace" и ".wheretrace" принимают числовой аргумент, который можно указать в шестнадцатеричном формате. Каждый бит включает различные части отладки. Обычно используются значения "0xfff" и "0xff". Чтобы отключить весь вывод трассировки, укажите аргумент "0".

  7. Использование команды оболочки ".breakpoint"

    Команда ".breakpoint" в CLI только вызывает процедуру с именем "test_breakpoint()", которая ничего не делает.

    Если у вас есть сценарий и вы хотите начать отладку с некоторого места в его середине, просто установите точку останова в gdb (или используемом вами отладчике) на функции test_breakpoint() и добавьте команду ".breakpoint" в нужном месте. Когда сработает первая точка останова, установите все необходимые дополнительные точки останова или отслеживание переменных.

  8. Отключите аллокатор памяти lookaside

    При поиске проблем с выделением памяти (утечек памяти, ошибок использования после освобождения, переполнения буфера и т. д.) иногда полезно отключить аллокатор памяти lookaside, а затем запустить тест под valgrind, MSAN или другим инструментом отладки кучи. Аллокатор памяти lookaside можно отключить при запуске с помощью интерфейса SQLITE_CONFIG_LOOKASIDE. Оболочка командной строки использует этот интерфейс для отключения lookaside, если запущена с параметром командной строки "--lookaside 0 0".

Последнее обновление этой страницы: 2025-05-31 13:08:22Z

SQLite is in the Public Domain.
https://sqlite.org/debugging.html

Spec-Zone.ru

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