SQLite---调试提示(十九)

返回: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.

使用编译时选项启用调试功能。

建议的编译时选项包括:

从调试器调用 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 命令行选项。

相关推荐
红海云20 分钟前
Jev:给智能系统做判断的模型
大数据·数据库·人工智能
wjkjpcba25 分钟前
PCBA烧录程序是什么:PCBA包工包料厂家解析烧录与测试
linux·数据库·人工智能·smt贴片加工·pcba贴片加工厂
hetao173383733 分钟前
2026-10-03~04 hetao1733837 的刷题记录
c++·算法
꯭自꯭闭꯭1 小时前
达梦事物特性及MVCC
linux·运维·数据库
小马同学-1 小时前
MySQL主从复制和读写分离
数据库·mysql
谢亮_vipxieliang1 小时前
Spring 事务失效的常见场景
java·开发语言·数据库·spring boot
longlongzihan1 小时前
从LeetCode 70. 爬楼梯看动态规划:如何精准推导状态转移方程?
c++·算法·leetcode·动态规划
geovindu2 小时前
sql: JSON and XML Data Handling in SQL using sql server 2025
大数据·数据库·sqlserver·数据库开发·数据库架构
IT大白鼠2 小时前
图数据库系列 · 第 02 篇——架构拆解:原生图存储到因果集群
数据库·架构·nosql
EatFan3 小时前
从“框架混战“到“运行时收敛“:2026 年 AI Agent 开发框架的三条路线之争
java·数据库·人工智能·多智能体·ai agent·mcp·agent 框架