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 命令行选项。

相关推荐
晴天的雨.99230 分钟前
【C++】继承篇
java·开发语言·c++
青少儿编程课堂38 分钟前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会图形化考级:校园大富翁经营闯关解析
c++·python·算法·bfs·信息学竞赛
another heaven39 分钟前
【C/C++ 第一次跨越(上):用 C++11/14 停止制造新的旧代码】
c语言·c++·制造
qq_4069810340 分钟前
c++ lamda(三)Lambda表达式
java·前端·c++
古典和浪漫1 小时前
MVCC机制
数据库
xixingzhe21 小时前
mysql全量、增量备份
数据库·mysql
AllData公司负责人9 小时前
AI大模型数据开发底座系列说明书,AllData集成Chat2DB开源项目建设AI 数据库分析底座,涵盖AI 洞察/对话SQL/智能视图!
数据库·人工智能·sql·开源·ai 洞察·对话sql
xixingzhe29 小时前
数据库备份的分类与特点
数据库
I_belong_to_jesus12 小时前
C++关于分支预测的优化1
开发语言·c++·算法
Rabitebla13 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash