Советы по отладке
Ниже представлен случайный набор техник, используемых разработчиками 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" в командной строке ничего не делает, кроме вызова процедуры с именем "test_breakpoint()", которая является пустой операцией.
Если у вас есть скрипт и вы хотите начать отладку где-то посередине этого скрипта, просто установите точку останова в gdb (или любом другом используемом вами отладчике) на функции test_breakpoint() и добавьте команду ".breakpoint" в том месте, где вы хотите остановить выполнение. Когда вы достигнете первой точки останова, установите любые дополнительные точки останова и переменные, которые вам нужны.
-
Отключение аллокатора памяти lookaside
При поиске проблем с выделением памяти (утечек памяти, ошибок use-after-free, переполнений буфера и т. д.) иногда полезно отключить аллокатор памяти lookaside и затем запустить тестирование с помощью valgrind или MSAN или другого инструмента отладки памяти кучи. Аллокатор lookaside памяти можно отключить во время запуска с помощью интерфейса SQLITE_CONFIG_LOOKASIDE. Командная оболочка будет использовать этот интерфейс для отключения lookaside, если она запускается с параметром командной строки "--lookaside 0 0".
Опции SQLITE_ENABLE_TREETRACE и SQLITE_ENABLE_WHERETRACE не документированы в документе опций времени компиляции, потому что они не поддерживаются официально. То, что они делают, — это активируют командные слова ".treetrace" и ".wheretrace" в командной оболочке, которые предоставляют вывод отслеживания низкого уровня для логики, генерирующей код для операторов SELECT и DML, а также для предложений WHERE, соответственно.
SQLite is in the Public Domain.
https://sqlite.org/debugging.html