1 个不稳定版本
使用旧的 Rust 2015
0.1.0 | 2015 年 8 月 3 日 |
---|
#29 在 #asm
7KB
81 代码行,不包括注释
breakpoint!()
用法
添加到 Cargo.toml
[dependencies]
breakpoint = "0.1.0"
将宏导入您的包
#![feature(asm)]
#[macro_use] extern crate breakpoint;
设置断点!
breakpoint!();
根据条件设置断点!
breakpoint!(ref_count == 1);
文档
lib.rs
:
在您的编辑器中设置断点。
用法
从 breakpoint
包导入宏。不幸的是,宏 breakpoint!()
依赖于宏 asm!()
,因此我们还需要 #![feature(asm)]
。
#![feature(asm)]
#[macro_use] extern crate breakpoint;
然后,在任何您希望调试器暂停的位置添加以下行
// Always pause.
breakpoint!();
// Only pause if `condition` is true.
breakpoint!(condition);
示例
想象我们有一个需要调试的非常棘手的函数,因为我们看到了整数下溢
fn tricky_function_must_be_debugged(val: usize) -> usize {
val - 1
}
我们可以从编辑器中设置程序断点,重新构建,并在调试器下运行以查看错误发生的位置
fn tricky_function_must_be_debugged(val: usize) -> usize {
// Set a breakpoint before the underflow, so we can debug!
breakpoint!();
val - 1
}
如果问题函数只被调用几次,恭喜!您现在已经发现了错误的根本原因!
然而,如果棘手的函数被多次调用,并且错误仅在多次调用后出现,那么仅在某些条件评估为真时断开连接很有用
fn tricky_function_must_be_debugged(val: usize) -> usize {
// Only break if we are going to underflow!
breakpoint!(val == 0);
val - 1
}
为什么?
它很方便。尤其是当你已经在你的编辑器里时,你可能记不起你的调试器的条件断点咒语(通常因为当前调试器版本对 Rust 表达式解析支持不佳而变得更糟),而且你的包也不是超级大,所以重新构建很快。
特别是,我对失败的测试引发的恐慌没有自动暂停我的调试器感到厌烦,而且我从来记不起在恐慌时断开的咒语。大多数时候,我觉得这比那更容易。
诚然,breakpoint!()
远非完美。这些事情在动态语言中表现得更好,在动态语言中重新评估函数非常容易,而且不需要完整的重新编译。