繁体   English   中英

在 Rust 中调试时执行语句

[英]Execute a statement while debugging in Rust

在用 Python 编码时,我经常做类似的事情

test.py

x = []
breakpoint()
± |master U:5 ?:4 ✗| → python3 test.py 
-> breakpoint()
(Pdb) x
[]
(Pdb) x.append(1)
(Pdb) x
[1]

是否可以在调试 Rust 时执行该语句?

use std::collections::HashMap;

fn main() { 
    let mut contacts = HashMap::new();

    contacts.insert("Daniel", "798-1364");
    contacts.insert("Ashley", "645-7689");
    //set breakpoint here
}

到目前为止,我可以在调试控制台中执行p contacts ,这个输出的含义对我来说并不直接。 如果我想知道println!("{:?}", contacts);的结果怎么办println!("{:?}", contacts); 无需在源文件中写入这行代码。

而且我还想知道contacts.insert("Robert", "956-1742") ,如果我在调试控制台中执行expr contacts.insert("Robert", "956-1742") ,它会说error: no field named insert

目前 lldb 和 gdb 对 Rust 调试的支持非常有限。 简单的表达式有效,任何更复杂的都可能导致问题。

我在使用rust-lldb测试时的经验:

  • 表达式解析器只能理解 Rust 的一个有限子集。 不支持宏。
  • 未使用的函数不包含在生成的二进制文件中。 例如,您不能在调试器中的HashMap上调用capacity() ,因为该函数不包含在二进制文件中。
  • 必须像这样调用方法: struct_value.method(&struct_value)
  • 我还没有找到在通用结构(如HashMap )上调用单态方法的方法。
  • lldb 表达式中的字符串常量 "..." 被创建为 C 风格的字符串常量,例如"abcdef"是一个包含尾随 NUL 字节的const char [7] 因此,它们不能轻易传递给需要&str参数的 Rust 函数。

尝试使用这样的辅助函数:

pub fn print_contacts(contacts: &HashMap<&str, &str>) {
    println!("{:?}", contacts);
}

导致 lldb 崩溃:

(lldb) expr print_contacts(&contacts)
PLEASE submit a bug report to https://bugs.llvm.org/ and include the crash backtrace.
Stack dump:
0.  Program arguments: [...]
Segmentation fault: 11

所以现在看来​​你想做的事情是不可能的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM