name: debugging description: 如何使用字节码比较、日志记录、ThreadSanitizer、确定性模拟和腐败分析工具调试TursoDB
调试指南
字节码比较流程
Turso旨在与SQLite兼容。当行为不同时:
1. 在sqlite3中EXPLAIN查询
2. 在tursodb中EXPLAIN查询
3. 比较字节码
├─ 不同 → 代码生成中的错误
└─ 相同但结果不同 → VM或存储层中的错误
示例
# 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;'
日志记录
# 在测试期间跟踪核心
RUST_LOG=none,turso_core=trace make test
# 输出到testing/test.log
# 警告:每次测试运行可能达兆字节
线程问题
使用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”命名。
# 模拟器
RUST_LOG=limbo_sim=debug cargo run --bin limbo_sim -- -s <seed>
# Whopper (并发DST)
SEED=1234 ./testing/concurrent-simulator/bin/run
架构参考
- 解析器 → 从SQL字符串生成AST
- 代码生成器 → 从AST生成字节码
- 虚拟机 → 执行SQLite兼容的字节码
- 存储层 → B树操作,分页
腐败调试
对于WAL腐败和数据库完整性问题,使用scripts中的腐败调试工具。
详细用法请参阅references/CORRUPTION-TOOLS.md。