首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Hints for Debugging SQLite

以下是SQLite开发人员用来跟踪,检查和理解核心SQLite库行为的随机分类。

这些技术旨在帮助理解核心SQLite库本身,而不是仅使用SQLite的应用程序。

  1. 命令行shell中使用“.eqp full”选项 当您正在调试或尝试理解的SQL脚本时,通常在命令行shell中使用“.eqp full”设置运行它通常很有用。当“.eqp”设置为FULL时,在实际运行该命令之前,shell会自动显示每条命令的EXPLAIN和EXPLAIN QUERY PLAN输出。为了增加可读性,还要设置“.echo on”,以便输出包含原始SQL文本。
  2. 使用编译时选项来启用调试功能。 建议的编译时选项包括:
-  [-DSQLITE\_DEBUG](compile#debug) 
-  [-DSQLITE\_ENABLE\_EXPLAIN\_COMMENTS](compile#enable_explain_comments) 
- -DSQLITE\_ENABLE\_SELECTTRACE 
- -DSQLITE\_ENABLE\_WHERETRACE 

SQLITE_ENABLE_SELECTTRACE和SQLITE_ENABLE_WHERETRACE选项在编译时选项文档中没有记录,因为它们没有官方支持。他们所做的是在命令行shell中激活“.selecttrace”和“.wheretrace”点命令,它们分别为生成SELECT语句和WHERE子句的代码的逻辑提供低级别的跟踪输出。

  1. Call sqlite3TreeViewExpr() and similar from the debugger. When compiled with SQLITE_DEBUG, SQLite includes routines that will print out various internal parse tree structures as ASCII-art graphs. This can be very useful in a debugging in order to understand the variables that SQLite is working with. For example, in gdb, to see the complete hierarchy of an Expr node (that is to say, the Expr node and all of its children), given a pointer "pExpr" to that node, type: print sqlite3TreeViewExpr(0, pExpr, 0)The two "0" parameters do server a purpose in some contexts, but for using these routine to print a parse tree as ASCII-art on the terminal, they should both be "0". Other similar tree-display routines include:
- sqlite3TreeViewSelect(0, pSelect, 0) 
- sqlite3TreeViewExprList(0, pList, 0, 0) 
  1. test_addoptrace上的断点 当调试字节码生成器时,知道生成特定操作码的位置通常很有用。为了方便查找,请在调试器中运行该脚本。在“test_addoptrace”例程上设置一个断点。然后运行“PRAGMA vdbe_addoptrace = ON;” 接着是相关的SQL语句。每个操作码都会在附加到VDBE程序后显示,并且此后立即触发断点。直到到达操作码和问题的步骤,然后在堆栈中向后看,看看它在哪里以及如何生成。这仅在使用SQLITE_DEBUG进行编译时才有效。
  2. 使用“.selecttrace”和“.wheretrace”shell命令 当命令行shell和核心SQLite库都使用SQLITE_DEBUG和SQLITE_ENABLE_SELECTTRACE和SQLITE_ENABLE_WHERETRACE编译时,shell有两个命令用于打开最复杂的调试工具代码生成器的部分 - 分别处理SELECT语句和WHERE子句的逻辑。“.selecttrace”和“.wheretrace”命令每个都有一个可以用十六进制表示的数字参数。每一位打开调试的各个部分。通常使用“0xfff”和“0xff”的值。使用参数“0”将所有跟踪输出关闭。
  3. 禁用 后备内存分配器 在寻找内存分配问题时(内存泄漏,释放后使用错误,缓冲区溢出等),禁用后备内存分配器然后在valgrind下运行测试有时会很有用。可以使用SQLITE_CONFIG_LOOKASIDE接口在启动时禁用后备内存分配器。如果以“--lookaside 0 0”命令行选项启动,命令行shell将使用该接口禁用旁视。
 SQLite在公共领域。

扫码关注腾讯云开发者

领取腾讯云代金券