Hints for Debugging SQLite
Debugging Hints
以下是SQLite开发人员用来跟踪,检查和理解核心SQLite库行为的随机分类。
这些技术旨在帮助理解核心SQLite库本身,而不是仅使用SQLite的应用程序。
在
命令行shell中使用“.eqp full”选项
当您正在
调试或尝试理解的SQL脚本时,通常在
命令行shell中使用“.eqp full”设置运行它通常很有用。当“.eqp”设置为FULL时,在
实际运行该命令之前,shell会自动显示每条命令的EXPLAIN和EXPLAIN QUERY PLAN输出。为了增加可读性,还要设置“.echo on”,以便输出包含原始SQL文本。
- [-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子句的代码的逻辑提供低级别的跟踪输出。
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)
test_addoptrace上的断点
当调试字节码生成器时,知道生成特定操作码的位置通常很有用。为了方便查找,请在调试器中运行该脚本。在“test_addoptrace”例程上设置一个断点。然后运行“PRAGMA vdbe_addoptrace = ON;” 接着是相关的SQL语句。每个操作码都会在附加到VDBE程序后显示,并且此后立即触发断点。直到到达操作码和问题的步骤,然后在堆栈中向后看,看看它在哪里以及如何生成。这仅在使用SQLITE_DEBUG进行编译时才有效。
SQLite在公共领域。