如何在GDB中漂亮地打印Rust HashMap?

3

这是一个简单的 Rust 示例,涉及 VecHashMap,我正在 GDB 中运行它:

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键和值?
3个回答

4

1
有没有办法查看所有的值?那个问题线程提到了你可以在PhantomData标记后打印内存...我的gdb-guy有点生疏。 :-) 有人知道怎么做吗? - Logan Reed

3
如果合并此PR,将启用对的漂亮打印。
BTreeMap和HashMap的API非常相似。因此,在调试时,您可以替换HashMapBTreeMap

3
首先,感谢您贡献了这些漂亮的打印机。关于请求取消踩赞,这是可能的,但除非您能说服踩赞者您是正确的或修复他们认为值得踩赞的答案中的缺陷,否则很难成功。我想指出的是,除了这里的冒犯性评论之外,问题在于提问者询问关于HashMap,而您回答的是BTreeMap;尽管这是有用的信息,但它似乎只与问题相关性较小。 - Matthieu M.
@fukatani - 谢谢,这是个好消息。看起来它已经合并了。也许这会帮助我找出HashMap的那个问题! - Logan Reed
@Shepmaster 我尝试过了,但 HashMap 对我来说太难了。我认为在当前版本中,使用 BTreeMap 仅用于调试是一个合理的方法。请原谅我。 - fukatani
@MatthieuM。那我应该删除我的回答吗? - fukatani
3
@fukatani,请不要让我们在Stack Overflow上这些过分追求准确的人影响到更广泛的Rust社区。 Stack Overflow有特定的标准,我们希望维护这些标准,以使问答尽可能有用,但这些准则并不适合每个人的个性。然而,Rust不仅限于Stack Overflow,并且还有许多其他途径,如用户论坛、IRC、Discord等。您可能会发现其中一个或多个途径更适合您自己的特定风格。顺便说一句,即使我使用LLDB而不是GDB,我也感谢您添加了那个支持;-) - Shepmaster
显示剩余3条评论

0

你可以使用rust-gdb/rust-lldb,它可以为HashMap中的键值对项提供漂亮的打印输出。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接