Как разыменовать Box в rust-gdb?

Пытаясь отладить свой код, написанный на Rust, я задался вопросом:

Как узнать на данные какого типа указывает Box<dyn ...> и как печатать эти данные (поля структуры)?

Печатаю переменную s:

(gdb) p s
$1 = core::option::Option<alloc::boxed::Box<StmtAble, alloc::alloc::Global>>::Some(izber::ir::Box<StmtAble, alloc::alloc::Global> {pointer: 0x5555555d9b70, vtable: 0x5555555d1950})

Ответы (1 шт):

Автор решения: ozkriff

s.0, что бы достать внутренности из Option, и * для разыменования Box'а:

(gdb) l
1       #![allow(unused_variables, dead_code)]
2       trait T {}
3       struct S { a: u32, b: String }
4       impl T for S {}
5       fn main() {
6           let a: Box<dyn T> = Box::new(S { a: 7, b: "abc".into()});
7           let b: Option<Box<dyn T>> = Some(Box::new(S { a: 8, b: "def".into()}));
8           println!("test");
9       }
10
(gdb) b main.rs:8
Breakpoint 1 at 0x156cd: file src/main.rs, line 8.
(gdb) r
<...>
Breakpoint 1, dbgtest::main () at src/main.rs:8
8           println!("test");
(gdb) p *a
$1 = dbgtest::S {a: 7, b: "abc"}
(gdb) p *(b.0)
$2 = dbgtest::S {a: 8, b: "def"}
→ Ссылка