6 个版本
0.3.0 | 2023年1月4日 |
---|---|
0.2.0 | 2022年1月19日 |
0.1.3 | 2021年4月23日 |
1067 在 开发工具 中排名
每月下载量 30 次
21KB
478 行
cargo-rr
rr(时间旅行调试器)的轻量级包装器。
你是否在调试器中反复运行相同的测试,试图找出代码是如何进入错误状态的?我们为你提供了一个工具!安装和设置简单,它将记录执行跟踪,并赋予gdb魔法般的新功能。向后执行,向后运行,查看变量的值何时改变或函数在对象上最后一次被调用(使用条件断点)。(来源)
示例
假设我们运行了一个名为 my_test
的测试并遇到了失败。我们首先在 rr
下重新运行测试以记录整个执行过程(包括测试与之交互的系统中的一切)。
> cargo rr test my_test
thread 'main' panicked at 'assertion failed: `(left == right)`
left: `1`,
right: `2`', tests/tests.rs:100
test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 2 filtered out; finished in 0.06s
让我们回放记录。
> cargo rr replay
(rr) continue
thread 'main' panicked at 'assertion failed: `(left == right)`
left: `1`,
right: `42`', tests/tests.rs:100
test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 2 filtered out; finished in 0.06s
我们将回退到失败的断言,以便查看 a
和 b
。
(rr) break tests/tests.rs:100
(rr) reverse-continue
Continuing.
Breakpoint 1, tests::main () at tests/tests.rs:100
100 assert_eq!(a, b);
(rr) print a
$1 = 1
(rr) print b
$2 = 42
我想知道 a
是如何被设置为 1
的?
(rr) watch -l a
(rr) reverse-continue
Old value = 1
New value = -1992923200
0x000055dcac485ed9 in tests::main () at tests/tests.rs:30
30 let a = some_calculation();
请注意,由于我们是反向执行,旧值和新值是相反的。-1992923200
是在它被用于 a
之前地址 0x000055dcac485ed9
中的值。
安装
cargo-rr
是一个 自定义cargo子命令。您可以通过从 crates.io
安装 cargo-rr
包来安装它:只需在终端中运行
cargo install cargo-rr
安装后,您可以在终端中运行 cargo rr
以访问 cargo-rr
。
用法
运行 cargo rr test
或 cargo rr run
,并传递您通常用于 cargo test
或 cargo run
的任何选项。例如,您可能运行 cargo rr test --test my_integration_test some_filter
。
一旦录制完毕,您可以使用 cargo rr replay
在调试器中回放最后的录制。
高级
使用选项 --rr-opts=".."
和 --gdb-opts="..."
分别将自定义选项传递给 rr 和 gdb。您负责确保您传递的选项不会与我们传递的选项冲突。您可以在源代码中查看我们传递的选项。我们不会保证这里的稳定性,但您可能不会遇到问题。
运行 cargo rr help
以查看完整用法。
依赖关系
~15–26MB
~367K SLoC