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

相关推荐
Ni-Guvara2 分钟前
函数对象笔记
c++·算法
似霰7 分钟前
安卓智能指针sp、wp、RefBase浅析
android·c++·binder
芊寻(嵌入式)17 分钟前
C转C++学习笔记--基础知识摘录总结
开发语言·c++·笔记·学习
獨枭19 分钟前
C++ 项目中使用 .dll 和 .def 文件的操作指南
c++
霁月风21 分钟前
设计模式——观察者模式
c++·观察者模式·设计模式
橘色的喵22 分钟前
C++编程:避免因编译优化引发的多线程死锁问题
c++·多线程·memory·死锁·内存屏障·内存栅栏·memory barrier
MonkeyKing_sunyuhua38 分钟前
ubuntu22.04 docker-compose安装postgresql数据库
数据库·docker·postgresql
天郁青38 分钟前
数据库交互的本地项目:后台管理系统
数据库·交互
马剑威(威哥爱编程)44 分钟前
MongoDB面试专题33道解析
数据库·mongodb·面试
何曾参静谧1 小时前
「C/C++」C/C++ 之 变量作用域详解
c语言·开发语言·c++