#调试 #测试 #rr

程序+库 cargo-rr

rr的时间旅行调试器的轻量级包装器

6 个版本

0.3.0 2023年1月4日
0.2.0 2022年1月19日
0.1.3 2021年4月23日

1067开发工具 中排名

每月下载量 30

MIT 许可证

21KB
478

cargo-rr

Crates.io MIT Licensed

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

我们将回退到失败的断言,以便查看 ab

(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 testcargo rr run,并传递您通常用于 cargo testcargo 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