返回:SQLite---系列文章目录
上一篇:SQLite Android 绑定(十八)
下一篇:从 SQLite 3.4.2 迁移到 3.5.0(二十)
以下是 SQLite 开发人员跟踪、检查和了解 核心 SQLite 库。
这些技术旨在帮助理解 核心SQLite库本身,而不是仅使用SQLite的应用程序。
SQLITE_ENABLE_TREETRACE和SQLITE_ENABLE_WHERETRACE选项 未记录在编译时选项文档中,因为它们 不受官方支持。他们所做的是激活 命令行中的".treetrace"和".wheretrace"点命令 shell,它为逻辑提供低级跟踪输出 分别为 SELECT 和 DML 语句以及 WHERE 子句生成代码。
在命令行 shell 中使用".eqp full"选项
当您有正在调试或尝试的 SQL 脚本时 为了理解,在命令行 shell 中使用".eqp full"设置运行它通常很有用。当 ".eqp" 设置为 FULL 时,shell 自动显示 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
从调试器调用 sqlite3ShowExpr() 和类似内容。
当使用 SQLITE_DEBUG 编译时,SQLite 包含的例程将 将各种内部抽象语法树结构打印为 ASCII 艺术图。 这在调试中非常有用,以便了解变量 SQLite正在使用。可以使用以下例程:
- 无效 sqlite3ShowExpr(const Expr*);
- 无效 sqlite3ShowExprList(const ExprList*);
- 无效 sqlite3ShowIdList(const IdList*);
- 无效 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,可能会更改。他们是 仅用于交互式调试。
4.
test_addoptrace上的断点
在调试字节码生成器时,了解通常很有用 正在生成特定操作码的位置。为了轻松找到它, 在调试器中运行脚本。在"test_addoptrace"上设置断点 常规。然后运行"PRAGMA vdbe_addoptrace=ON;",然后运行 有问题的 SQL 语句。每个操作码将按原样显示 附加到 VDBE 程序,断点将立即触发 此后。步进直到到达操作码,然后向后看 以查看其生成位置和方式。
这仅在使用 SQLITE_DEBUG 编译时才有效。
5.
使用 ".treetrace" 和 ".wheretrace" shell 命令
当命令行 shell 和核心 SQLite 库 两者都用 SQLITE_DEBUG 和 SQLITE_ENABLE_TREETRACE 和 SQLITE_ENABLE_WHERETRACE,然后 shell 有两个命令用于打开 代码生成器最复杂的部分 - 处理 分别是 SELECT 语句和 WHERE 子句。 ".treetrace"和".wheretrace"命令各采用一个数字 可以用十六进制表示的论点。每个位都打开 调试的各个部分。"0xfff"和"0xff"的值通常为 使用。使用参数"0"关闭所有跟踪输出。
6.
使用".breakpoint"shell 命令
CLI 中的".breakpoint"命令只调用 名为"test_breakpoint()"的过程,这是一个无操作。
如果你有一个脚本,并且想要在某个时候开始调试 在该脚本的中途,只需在 gdb(或其他任何内容)中设置一个断点 正在使用的调试器)上test_breakpoint,并添加一个 ".breakpoint"命令。当你第一次到达时 断点,设置任何额外的断点是变量跟踪你 需要。
7.
禁用后备内存分配器
查找内存分配问题(内存泄漏、释放后使用 错误、缓冲区溢出等)有时禁用后备内存分配器,然后在 valgrind 或 MSAN 或 其他一些堆内存调试工具。 后备内存分配器可以 在启动时使用 SQLITE_CONFIG_LOOKASIDE 界面禁用。命令行 shell 将使用该接口来执行以下操作 如果以"--lookaside 0 0"开头,则禁用 lookaside 命令行选项。