Как мне красиво распечатать Rust HashMap в GDB? - PullRequest
0 голосов
/ 04 мая 2018

Вот простой пример Rust с Vec и HashMap, который я запускаю в 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 pretty включен, потому что Vec распечатывается просто отлично.

Как я могу получить HashMap ключи и значения в обычном GDB?

Ответы [ 2 ]

0 голосов
/ 17 августа 2018

Довольно печать BTreeMap будет включена, если этот PR объединен .

API-интерфейсы BTreeMap и HashMap похожи. Таким образом, вы можете заменить HashMap и BTreeMap для отладки.

0 голосов
/ 05 мая 2018

В настоящее время невозможно просто распечатать элементы значений ключа для HashMap.

Существует открытый вопрос, запрашивающий эту функцию .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...