小巧、快速、可靠。
任選三項。

除錯提示

以下是 SQLite 開發人員用於追蹤、檢查和了解核心 SQLite 函式庫行為的隨機技術組合。

這些技術旨在協助了解核心 SQLite 函式庫本身,而非僅使用 SQLite 的應用程式。

  1. 命令列殼層 上使用「.eqp full」選項

    當您有要除錯或嘗試了解的 SQL 腳本時,通常可以在 命令列殼層 中使用「.eqp full」設定來執行它。當「.eqp」設為 FULL 時,殼層會在實際執行每個指令前自動顯示 EXPLAINEXPLAIN QUERY PLAN 輸出。

    為了增加可讀性,也請設定「.echo on」,這樣輸出就會包含原始 SQL 文字。

    較新的「.eqp trace」指令會執行「.eqp full」所做的一切,也會開啟 VDBE 追蹤

  2. 使用編譯時期選項來啟用除錯功能。

    建議的編譯時期選項包括

  3. SQLITE_ENABLE_TREETRACE 和 SQLITE_ENABLE_WHERETRACE 選項未記載於 編譯時間選項 文件中,因為它們並未獲得官方支援。它們會在命令列殼層中啟用「.treetrace」和「.wheretrace」點命令,分別針對產生 SELECT 和 DML 陳述式以及 WHERE 子句的邏輯提供低階追蹤輸出。

  4. 從偵錯器呼叫 sqlite3ShowExpr() 和類似的函式。

    當使用 SQLITE_DEBUG 編譯時,SQLite 會包含會將各種內部抽象語法樹結構印出為 ASCII 藝術圖形的例常程式。這對於偵錯時了解 SQLite 使用的變數非常有用。以下例常程式可供使用

    這些例常程式並非 API,且可能會變更。它們僅供互動式偵錯使用。

  5. 在 test_addoptrace 上中斷

    在偵錯 位元組碼 產生器時,通常會想知道特定位元組碼在哪裡產生。若要輕鬆找到,請在偵錯器中執行腳本。在「test_addoptrace」例常程式上設定中斷點。然後執行「PRAGMA vdbe_addoptrace=ON;」,接著執行有問題的 SQL 陳述式。每個位元組碼會在附加到 VDBE 程式時顯示,且中斷點會在之後立即觸發。逐步執行直到到達位元組碼,然後在堆疊中向後查看,以了解它在哪裡以及如何產生。

    這僅在使用 SQLITE_DEBUG 編譯時有效。

  6. 使用「.treetrace」和「.wheretrace」shell 命令

    當命令列 shell 和核心 SQLite 函式庫都使用 SQLITE_DEBUG 和 SQLITE_ENABLE_TREETRACE 及 SQLITE_ENABLE_WHERETRACE 編譯時,shell 會有兩個命令用於開啟對程式碼產生器最複雜部分的偵錯功能,分別處理 SELECT 陳述式和 WHERE 子句的邏輯。「.treetrace」和「.wheretrace」命令各取一個數字引數,可以用十六進位表示。每個位元會開啟偵錯的不同部分。通常會使用「0xfff」和「0xff」的值。使用「0」引數會關閉所有追蹤輸出。

  7. 使用「.breakpoint」shell 命令

    CLI 中的「.breakpoint」命令只會呼叫名為「test_breakpoint()」的程序,它是一個空操作。

    如果您有一個腳本,而且您想要在腳本進行到一半時開始偵錯,只要在 gdb(或您正在使用的任何偵錯器)中對 test_breakpoint() 函式設定一個中斷點,並在您想要停止的地方加入一個「.breakpoint」命令。當您到達第一個中斷點時,設定您需要的任何其他中斷點作為變數追蹤。

  8. 停用 lookaside 記憶體配置器

    在尋找記憶體配置問題(記憶體外洩、釋放後使用錯誤、緩衝區溢位等)時,有時停用 lookaside 記憶體配置器 很有用,然後在 valgrind 或 MSAN 或其他堆記憶體偵錯工具下執行測試。lookaside 記憶體配置器可以在啟動時使用 SQLITE_CONFIG_LOOKASIDE 介面停用。如果 命令列 shell 使用「--lookaside 0 0」命令列選項啟動,它會使用該介面停用 lookaside。