Подсказки по отладке
Ниже приведена случайная подборка методов, которые разработчики SQLite используют для отслеживания, изучения и понимания поведения основной библиотеки SQLite.
Эти методы предназначены для помощи в понимании самой основной библиотеки SQLite, а не приложений, которые лишь используют SQLite.
-
Используйте параметр ".eqp full" в оболочке командной строки
Если у вас есть сценарий SQL, который вы отлаживаете или пытаетесь понять, часто бывает полезно запустить его в оболочке командной строки с настройкой ".eqp full". Когда для ".eqp" задано значение FULL, оболочка автоматически выводит результаты EXPLAIN и EXPLAIN QUERY PLAN для каждой команды перед её фактическим выполнением.
Для большей наглядности также задайте ".echo on", чтобы в выводе отображался исходный текст SQL.
Более новая команда ".eqp trace" делает всё то же, что и ".eqp full", а также включает трассировку VDBE.
-
Используйте параметры времени компиляции для включения средств отладки.
Рекомендуемые параметры времени компиляции:
- -DSQLITE_DEBUG
- -DSQLITE_ENABLE_EXPLAIN_COMMENTS
- -DSQLITE_ENABLE_TREETRACE
- -DSQLITE_ENABLE_WHERETRACE
-
Вызывайте 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 и могут измениться. Они предназначены только для интерактивной отладки.
-
Точки останова в test_addoptrace
При отладке генератора байт-кода часто бывает полезно узнать, где генерируется конкретный код операции. Это легко выяснить, запустив сценарий в отладчике. Установите точку останова на процедуре "test_addoptrace". Затем выполните "PRAGMA vdbe_addoptrace=ON;", а после него — нужный оператор SQL. Каждый код операции будет отображаться при добавлении в программу VDBE, и сразу после этого сработает точка останова. Выполняйте программу пошагово до нужного кода операции, затем просмотрите стек вызовов, чтобы узнать, где и как он был сгенерирован.
Это работает только при компиляции с SQLITE_DEBUG.
-
Использование команд оболочки ".treetrace" и ".wheretrace"
Если оболочка командной строки и основная библиотека SQLite скомпилированы с SQLITE_DEBUG, SQLITE_ENABLE_TREETRACE и SQLITE_ENABLE_WHERETRACE, то в оболочке доступны две команды для включения средств отладки самых сложных частей генератора кода — логики обработки операторов SELECT и предложений WHERE соответственно. Команды ".treetrace" и ".wheretrace" принимают числовой аргумент, который можно указать в шестнадцатеричном формате. Каждый бит включает различные части отладки. Обычно используются значения "0xfff" и "0xff". Чтобы отключить весь вывод трассировки, укажите аргумент "0".
-
Использование команды оболочки ".breakpoint"
Команда ".breakpoint" в CLI только вызывает процедуру с именем "test_breakpoint()", которая ничего не делает.
Если у вас есть сценарий и вы хотите начать отладку с некоторого места в его середине, просто установите точку останова в gdb (или используемом вами отладчике) на функции test_breakpoint() и добавьте команду ".breakpoint" в нужном месте. Когда сработает первая точка останова, установите все необходимые дополнительные точки останова или отслеживание переменных.
-
Отключите аллокатор памяти lookaside
При поиске проблем с выделением памяти (утечек памяти, ошибок использования после освобождения, переполнения буфера и т. д.) иногда полезно отключить аллокатор памяти lookaside, а затем запустить тест под valgrind, MSAN или другим инструментом отладки кучи. Аллокатор памяти lookaside можно отключить при запуске с помощью интерфейса SQLITE_CONFIG_LOOKASIDE. Оболочка командной строки использует этот интерфейс для отключения lookaside, если запущена с параметром командной строки "--lookaside 0 0".
Параметры SQLITE_ENABLE_TREETRACE и SQLITE_ENABLE_WHERETRACE не описаны в документе о параметрах времени компиляции, поскольку официально не поддерживаются. Они активируют команды оболочки ".treetrace" и ".wheretrace", которые выводят низкоуровневую трассировочную информацию о логике генерации кода для операторов SELECT и DML, а также для предложений WHERE соответственно.
Последнее обновление этой страницы: 2025-05-31 13:08:22Z
SQLite is in the Public Domain.
https://sqlite.org/debugging.html