以下是 SQLite 開發人員用於追蹤、檢查和了解核心 SQLite 函式庫行為的隨機技術組合。
這些技術旨在協助了解核心 SQLite 函式庫本身,而非僅使用 SQLite 的應用程式。
在 命令列殼層 上使用「.eqp full」選項
當您有要除錯或嘗試了解的 SQL 腳本時,通常可以在 命令列殼層 中使用「.eqp full」設定來執行它。當「.eqp」設為 FULL 時,殼層會在實際執行每個指令前自動顯示 EXPLAIN 和 EXPLAIN QUERY PLAN 輸出。
為了增加可讀性,也請設定「.echo on」,這樣輸出就會包含原始 SQL 文字。
較新的「.eqp trace」指令會執行「.eqp full」所做的一切,也會開啟 VDBE 追蹤。
使用編譯時期選項來啟用除錯功能。
建議的編譯時期選項包括
SQLITE_ENABLE_TREETRACE 和 SQLITE_ENABLE_WHERETRACE 選項未記載於 編譯時間選項 文件中,因為它們並未獲得官方支援。它們會在命令列殼層中啟用「.treetrace」和「.wheretrace」點命令,分別針對產生 SELECT 和 DML 陳述式以及 WHERE 子句的邏輯提供低階追蹤輸出。
從偵錯器呼叫 sqlite3ShowExpr() 和類似的函式。
當使用 SQLITE_DEBUG 編譯時,SQLite 會包含會將各種內部抽象語法樹結構印出為 ASCII 藝術圖形的例常程式。這對於偵錯時了解 SQLite 使用的變數非常有用。以下例常程式可供使用
這些例常程式並非 API,且可能會變更。它們僅供互動式偵錯使用。
在 test_addoptrace 上中斷
在偵錯 位元組碼 產生器時,通常會想知道特定位元組碼在哪裡產生。若要輕鬆找到,請在偵錯器中執行腳本。在「test_addoptrace」例常程式上設定中斷點。然後執行「PRAGMA vdbe_addoptrace=ON;」,接著執行有問題的 SQL 陳述式。每個位元組碼會在附加到 VDBE 程式時顯示,且中斷點會在之後立即觸發。逐步執行直到到達位元組碼,然後在堆疊中向後查看,以了解它在哪裡以及如何產生。
這僅在使用 SQLITE_DEBUG 編譯時有效。
使用「.treetrace」和「.wheretrace」shell 命令
當命令列 shell 和核心 SQLite 函式庫都使用 SQLITE_DEBUG 和 SQLITE_ENABLE_TREETRACE 及 SQLITE_ENABLE_WHERETRACE 編譯時,shell 會有兩個命令用於開啟對程式碼產生器最複雜部分的偵錯功能,分別處理 SELECT 陳述式和 WHERE 子句的邏輯。「.treetrace」和「.wheretrace」命令各取一個數字引數,可以用十六進位表示。每個位元會開啟偵錯的不同部分。通常會使用「0xfff」和「0xff」的值。使用「0」引數會關閉所有追蹤輸出。
使用「.breakpoint」shell 命令
CLI 中的「.breakpoint」命令只會呼叫名為「test_breakpoint()」的程序,它是一個空操作。
如果您有一個腳本,而且您想要在腳本進行到一半時開始偵錯,只要在 gdb(或您正在使用的任何偵錯器)中對 test_breakpoint() 函式設定一個中斷點,並在您想要停止的地方加入一個「.breakpoint」命令。當您到達第一個中斷點時,設定您需要的任何其他中斷點作為變數追蹤。
在尋找記憶體配置問題(記憶體外洩、釋放後使用錯誤、緩衝區溢位等)時,有時停用 lookaside 記憶體配置器 很有用,然後在 valgrind 或 MSAN 或其他堆記憶體偵錯工具下執行測試。lookaside 記憶體配置器可以在啟動時使用 SQLITE_CONFIG_LOOKASIDE 介面停用。如果 命令列 shell 使用「--lookaside 0 0」命令列選項啟動,它會使用該介面停用 lookaside。