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

相关推荐
CodeWithMe13 分钟前
【C/C++】EBO空基类优化介绍
开发语言·c++
@大嘴巴子20 分钟前
MySQL知识回顾总结----数据库基础
数据库·mysql
lubiii_20 分钟前
SQL手工测试(MySQL数据库)
数据库·mysql·web安全·网络安全
凌辰揽月27 分钟前
Web后端基础(基础知识)
java·开发语言·前端·数据库·学习·算法
想你依然心痛32 分钟前
数据库入门:从原理到应用
数据库
k要开心34 分钟前
从C到C++语法过度1
开发语言·c++
whoarethenext44 分钟前
使用 C/C++的OpenCV 实时播放火柴人爱心舞蹈动画
c语言·c++·opencv
能工智人小辰1 小时前
Codeforces Round 509 (Div. 2) C. Coffee Break
c语言·c++·算法
梦星辰.1 小时前
VSCode CUDA C++进行Linux远程开发
linux·c++·vscode
whoarethenext2 小时前
C++ OpenCV 学习路线图
c++·opencv·学习