在 Rust 中调试时执行语句

Com*_*non 9 debugging rust

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

\n

test.py

\n
x = []\nbreakpoint()\n
Run Code Online (Sandbox Code Playgroud)\n
\xc2\xb1 |master U:5 ?:4 \xe2\x9c\x97| \xe2\x86\x92 python3 test.py \n-> breakpoint()\n(Pdb) x\n[]\n(Pdb) x.append(1)\n(Pdb) x\n[1]\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
use std::collections::HashMap;\n\nfn main() { \n    let mut contacts = HashMap::new();\n\n    contacts.insert("Daniel", "798-1364");\n    contacts.insert("Ashley", "645-7689");\n    //set breakpoint here\n}\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n

HHK*_*HHK 9

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

我在测试时的经验rust-lldb

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

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

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

导致 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
Run Code Online (Sandbox Code Playgroud)

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