Как разыменовать 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"}