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 自动显示 EXPLAINEXPLAIN 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 命令行选项。

相关推荐
jiunian_cn7 分钟前
【Redis】数据库管理操作
数据库·redis·缓存
打工哪有不疯的11 分钟前
使用 MSYS2 为 Qt (MinGW 32/64位) 完美配置 OpenSSL
c++·qt
代码游侠25 分钟前
C语言核心概念复习——C语言基础阶段
linux·开发语言·c++·学习
_Johnny_31 分钟前
ETCD 配额/空间告警模拟方案
网络·数据库·etcd
㓗冽34 分钟前
60题之内难题分析
开发语言·c++·算法
rainbow688943 分钟前
C++开源库dxflib解析DXF文件实战
开发语言·c++·开源
猫头虎44 分钟前
基于信创openEuler系统安装部署OpenTeleDB开源数据库的实战教程
数据库·redis·sql·mysql·开源·nosql·database
John_ToDebug1 小时前
Chromium安全架构深度解析:从悬空指针检测到内存安全防御体系
c++·chrome
爬山算法1 小时前
MongoDB(1)什么是MongoDB?
数据库·mongodb
D_evil__1 小时前
【Effective Modern C++】第五章 右值引用、移动语义和完美转发:24. 区分万能引用和右值引用
c++