用途:面向 Turso 数据库(tursodb)开发者,提供排查 SQL 行为差异、线程问题、深层递归栈占用及数据库损坏的调试方法。
主要能力与用法:
- 字节码对比:在 sqlite3 与 tursodb 中分别执行 EXPLAIN 查询并比较字节码。不同则疑为代码生成 bug;相同但结果不同则疑为 VM 或存储层 bug。示例:sqlite3 :memory: "EXPLAIN SELECT 1 + 1;" 与 cargo run --bin tursodb :memory: "EXPLAIN SELECT 1 + 1;"。也可手动检查查询:cargo run --bin tursodb :memory: 'SELECT * FROM foo;' 与 EXPLAIN 版本。
- 日志:RUST_LOG=none,turso_core=trace make test,输出到 testing/test.log,单次测试可能达数兆字节。
- 线程问题:使用压力测试配合 ThreadSanitizer,需 nightly 工具链,示例命令见资料中的 cargo run -Zbuild-std 调用,指定 --vfs syscall、线程数与迭代次数。
- 确定性模拟:用种子复现 bug,模拟器沿用旧名 limbo:RUST_LOG=limbo_sim=debug cargo run --bin limbo_sim -- -s <seed>;并发 DST 用 SEED=1234 ./testing/concurrent-simulator/bin/run。
- 栈占用:解析与翻译表达式按嵌套层级递归,函数栈帧限制表达式深度。scripts/stack/ 下三个脚本用于测量,需使用 release 构建(cargo build --release --bin tursodb),各脚本支持 -h 查看选项:frame-sizes.sh 读取函数序言中的帧大小并可对比两个二进制;min-stack.sh 测运行 SQL 脚本所需最小栈;stack-profile.sh 在 lldb 下查看最深点的函数。递归函数应保持小体积,将罕见大路径移入 #[inline(never)] 辅助函数。
- 损坏调试:WAL 损坏与数据库完整性问题使用 scripts 中的损坏调试工具,详细用法见 references/CORRUPTION-TOOLS.md。
架构参考:解析器将 SQL 字符串转为 AST,代码生成器将 AST 转为字节码,虚拟机执行与 SQLite 兼容的字节码,存储层负责 B 树操作与分页。
限制:日志输出可能很大;栈测量须用 release 构建,debug 构建不重用栈槽,参考意义有限;部分工具依赖 nightly 工具链与 lldb;模拟器命名仍为 limbo。