【问题标题】:How do I pretty-print a Rust HashMap in GDB?如何在 GDB 中漂亮地打印 Rust HashMap?
【发布时间】:2018-10-15 05:18:30
【问题描述】:

这是一个简单的 Rust 示例,其中包含我在 GDB 中运行的 VecHashMap

use std::collections::HashMap;

fn main() {
    let v = vec!["Mon", "Tue", "Wed"];
    println!("{:?}", v);

    let mut h = HashMap::new();
    h.insert(1,"Jan");
    h.insert(2,"Feb");
    h.insert(3,"Mar");
    h.insert(4,"Apr");
    println!("{:?}", h);
}

当我查看Vec 时,它打印得很漂亮,而HashMap 则不是:

bash$ rust-gdb target/debug/test_hashmap
GNU gdb (GDB) 8.1
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-pc-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from target/debug/test_hashmap...done.
(gdb) b 12
Breakpoint 1 at 0xa056: file src/main.rs, line 12.
(gdb) r
Starting program: /home/john/proj/test_hashmap/target/debug/test_hashmap 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/usr/lib/libthread_db.so.1".
["Mon", "Tue", "Wed"]

Breakpoint 1, test_hashmap::main () at src/main.rs:12
12          println!("{:?}", h);
(gdb) p v
$1 = Vec<&str>(len: 3, cap: 3) = {"Mon", "Tue", "Wed"}
(gdb) p h
$2 = HashMap<i32, &str, std::collections::hash::map::RandomState> = {hash_builder = RandomState = {k0 = 12919411587537124140, 
    k1 = 836420561220520453}, table = RawTable<i32, &str> = {capacity_mask = 31, size = 4, hashes = TaggedHashUintPtr = {
      Unique<usize> = {pointer = NonZero<*const usize> = {0x7ffff6c1c400}, _marker = PhantomData<usize>}}, 
    marker = PhantomData<(i32, &str)>}, resize_policy = DefaultResizePolicy}
(gdb) info pretty-printer
global pretty-printers:
  builtin
    mpx_bound128
  objfile /home/john/proj/test_hashmap/target/debug/test_hashmap pretty-printers:
  rust_pretty_printer_lookup_function
(gdb) n
{1: "Jan", 4: "Apr", 3: "Mar", 2: "Feb"}
13      }
(gdb) 

程序看到HashMap(并打印出它的值),但我在 GDB 中看不到那些。 Rust 漂亮的打印机似乎已启用,因为 Vec 打印得很好。

如何在常规 GDB 中获取 HashMap 键和值?

【问题讨论】:

    标签: hashmap rust gdb


    【解决方案1】:

    目前无法为HashMap 漂亮地打印键值项。

    an open issue requesting this feature

    【讨论】:

    • 有什么方法可以查看这些值吗?该问题线程提到您可以在 PhantomData 标记之后打印内存...我的 gdb-guy 有点生锈。 :-) 有人知道怎么做吗?
    【解决方案2】:

    BTreeMap 将启用漂亮打印this PR is merged

    BTreeMap 和 HashMap API 是相似的。因此,您可以替换HashMapBTreeMap 进行调试。

    【讨论】:

    • @fukatani:首先,感谢您提供漂亮的打印机。关于要求删除反对票,这当然是可能的,但是除非您可以说服反对票的人您是对的,或者修复他们认为值得反对的答案的任何缺陷,否则它不太可能成功。我会注意到,除了这里的冒犯性评论;有问题是 OP 询问HashMap 而您正在回复BTreeMap;因此,虽然它是有用的信息,但似乎与手头的问题关系不大。
    • @fukatani - 谢谢,这是个好消息。好像已经合并了。可能这会帮助我找出 HashMap 的那个!
    • @Shepmaster 我试过了,但HashMap 对我来说很难。我认为当前版本的合理方法之一是仅使用 BTreeMap 进行调试。原谅我。
    • @MatthieuM。那么我应该删除我的答案吗?
    • @fukatani 请不要让我们在 Stack Overflow 上学究气的人减损更大的 Rust 社区。 Stack Overflow 有我们寻求维护的特定标准,以使问答尽可能有用,这些准则并不适合每个人的个性。然而,Rust 不仅仅是 Stack Overflow,还有许多其他途径,如用户论坛、IRC、Discord 等。您可能会发现其中一种或多种更适合您自己的特定风格。 FWIW,我也感谢您添加支持,即使我使用 LLDB 而不是 GDB ;-)
    【解决方案3】:

    您可以使用 rust-gdb/rust-lldb,它可以漂亮地打印 HashMap 的键值项。

    【讨论】:

      猜你喜欢
      • 2012-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多