debugging について
Turso のデバッグガイドです。SQL の動作比較、ログ、並行テスト、決定的シミュレーション、スタック使用量の調査を扱います。プロジェクトのデータベースやランタイムの問題を調べる開発者向けです。
主な機能
- 01SQLite と Turso のバイトコード比較
- 02tursodb による SQL クエリの確認
- 03テスト中のコアログ追跡
- 04シードによる並行バグの再現
- 05スタック使用量の測定
活用シーン
- 01SQLite 互換クエリの動作差の特定
- 02スレッドやストレージ関連の障害調査
- 03深くネストした式のスタック制限確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ tursodatabase/ turso --skill debuggingインストール後、Claude Code で/debuggingを入力して読み込まれたか確認します。
詳細
デバッグガイド
バイトコード比較の流れ
Turso は SQLite との互換性を目指しています。動作に違いがある場合:
1. EXPLAIN query in sqlite3
2. EXPLAIN query in tursodb
3. Compare bytecode
├─ Different → bug in code generation
└─ Same but results differ → bug in VM or storage layer
例
# SQLite
sqlite3 :memory: "EXPLAIN SELECT 1 + 1;"
# Turso
cargo run --bin tursodb :memory: "EXPLAIN SELECT 1 + 1;"
クエリの手動検査
cargo run --bin tursodb :memory: 'SELECT * FROM foo;'
cargo run --bin tursodb :memory: 'EXPLAIN SELECT * FROM foo;'
ロギング
# Trace core during tests
RUST_LOG=none,turso_core=trace make test
# Output goes to testing/test.log
# Warning: can be megabytes per test run
スレッド関連の問題
ThreadSanitizer を使ってストレステストを実行します:
rustup toolchain install nightly
rustup override set nightly
cargo run -Zbuild-std --target x86_64-unknown-linux-gnu \
-p turso_stress -- --vfs syscall --nr-threads 4 --nr-iterations 1000
決定論的シミュレーション
シードを指定してバグを再現します。注:シミュレーターでは従来の「limbo」という名前が使われています。
# Simulator
RUST_LOG=limbo_sim=debug cargo run --bin limbo_sim -- -s <seed>
# Whopper (concurrent DST)
SEED=1234 ./testing/concurrent-simulator/bin/run
スタック使用量
式の解析と変換では、ネストの各レベルで再帰するため、これらの関数のスタックフレームサイズによって、扱える式の深さが制限されます。scripts/stack/ にある3つのスクリプトでスタック使用量を測定できます。リリースビルド(cargo build --release --bin tursodb)を使用してください。デバッグビルドではスタックスロットが再利用されないため、そのフレームはユーザーが実行するビルドの実態をほとんど示しません。すべてのオプションを確認するには、各スクリプトを -h 付きで実行してください。
# Frame size of each function, read from its prologue. -c compares two binaries.
scripts/stack/frame-sizes.sh 'translate::expr::'
scripts/stack/frame-sizes.sh -c /tmp/tursodb-main 'translate_expr$' 'parse_expr_inner$'
# Smallest stack that runs a SQL script, per binary. -S adds sqlite3.
scripts/stack/min-stack.sh -S -b /tmp/tursodb-main -b target/release/tursodb deep.sql
# Which functions use the stack at the deepest point (runs under lldb).
scripts/stack/stack-profile.sh deep.sql
各レベルで再帰する関数は小さくしてください。まれにしか使われない大きな処理は、SQLite の SQLITE_NOINLINE のように、#[inline(never)] を付けたヘルパー関数に移動します。
アーキテクチャの概要
- パーサー → SQL 文字列から AST を生成
- コードジェネレーター → AST からバイトコードを生成
- 仮想マシン → SQLite 互換のバイトコードを実行
- ストレージ層 → B ツリー操作、ページング
破損のデバッグ
WAL の破損やデータベースの整合性に関する問題には、scripts にある破損デバッグツールを使用します。
詳しい使い方については、references/CORRUPTION-TOOLS.md を参照してください。