generic-array icon indicating copy to clipboard operation
generic-array copied to clipboard

Debugging using gdb is unergonomic

Open teythoon opened this issue 2 years ago • 4 comments

I'm trying to debug an issue involving GenericArray:

(gdb) print expected_tag
$11 = generic_array::GenericArray<u8, typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UInt<typenum::uint::UTerm, typenum::bit::B1>, typenum::bit::B0>, typenum::bit::B0>, typenum::bit::B0>, typenum::bit::B0>> {data: generic_array::GenericArrayImplEven<u8, generic_array::GenericArrayImplEven<u8, generic_array::GenericArrayImplEven<u8, generic_array::GenericArrayImplEven<u8, generic_array::GenericArrayImplOdd<u8, [u8; 0]>>>>> {parent1: generic_array::GenericArrayImplEven<u8, generic_array::GenericArrayImplEven<u8, generic_array::GenericArrayImplEven<u8, generic_array::GenericArrayImplOdd<u8, [u8; 0]>>>> {parent1: generic_array::GenericArrayImplEven<u8, generic_array::GenericArrayImplEven<u8, generic_array::GenericArrayImplOdd<u8, [u8; 0]>>> {parent1: generic_array::GenericArrayImplEven<u8, generic_array::GenericArrayImplOdd<u8, [u8; 0]>> {parent1: generic_array::GenericArrayImplOdd<u8, [u8; 0]> {parent1: [], parent2: [], data: 210}, parent2: generic_array::GenericArrayImplOdd<u8, [u8; 0]> {parent1: [], parent2: [], data: 70}, _marker: core::marker::PhantomData<u8>}, parent2: generic_array::GenericArrayImplEven<u8, generic_array::GenericArrayImplOdd<u8, [u8; 0]>> {parent1: generic_array::GenericArrayImplOdd<u8, [u8; 0]> {parent1: [], parent2: [], data: 244}, parent2: generic_array::GenericArrayImplOdd<u8, [u8; 0]> {parent1: [], parent2: [], data: 123}, _marker: core::marker::PhantomData<u8>}, _marker: core::marker::PhantomData<u8>}, parent2: generic_array::GenericArrayImplEven<u8, generic_array::GenericArrayImplEven<u8, generic_array::GenericArrayImplOdd<u8, [u8; 0]>>> {parent1: generic_array::GenericArrayImplEven<u8, generic_array::GenericArrayImplOdd<u8, [u8; 0]>> {parent1: generic_array::GenericArrayImplOdd<u8, [u8; 0]> {parent1: [], parent2: [], data: 31}, parent2: generic_array::GenericArrayImplOdd<u8, [u8; 0]> {parent1: [], parent2: [], data: 91}, _marker: core::marker::PhantomData<u8>}, parent2: generic_array::GenericArrayImplEven<u8, generic_array::GenericArrayImplOdd<u8, [u8; 0]>> {parent1: generic_array::GenericArrayImplOdd<u8, [u8; 0]> {parent1: [], parent2: [], data: 78}, parent2: generic_array::GenericArrayImplOdd<u8, [u8; 0]> {parent1: [], parent2: [], data: 216}, _marker: core::marker::PhantomData<u8>}, _marker: core::marker::PhantomData<u8>}, _marker: core::marker::PhantomData<u8>}, parent2: generic_array::GenericArrayImplEven<u8, generic_array::GenericArrayImplEven<u8, generic_array::GenericArrayImplEven<u8, generic_array::GenericArrayImplOdd<u8, [u8; 0]>>>> {parent1: generic_array::GenericArrayImplEven<u8, generic_array::GenericArrayImplEven<u8, generic_array::GenericArrayImplOdd<u8, [u8; 0]>>> {parent1: generic_array::GenericArrayImplEven<u8, generic_array::GenericArrayImplOdd<u8, [u8; 0]>> {parent1: generic_array::GenericArrayImplOdd<u8, [u8; 0]> {parent1: [], parent2: [], data: 195}, parent2: generic_array::GenericArrayImplOdd<u8, [u8; 0]> {parent1: [], parent2: [], data: 10}, _marker: core::marker::PhantomData<u8>}, parent2: generic_array::GenericArrayImplEven<u8, generic_array::GenericArrayImplOdd<u8, [u8; 0]>> {parent1: generic_array::GenericArrayImplOdd<u8, [u8; 0]> {parent1: [], parent2: [], data: 108}, parent2: generic_array::GenericArrayImplOdd<u8, [u8; 0]> {parent1: [], parent2: [], data: 190}, _marker: core::marker::PhantomData<u8>}, _marker: core::marker::PhantomData<u8>}, parent2: generic_array::GenericArrayImplEven<u8, generic_array::GenericArrayImplEven<u8, generic_array::GenericArrayImplOdd<u8, [u8; 0]>>> {parent1: generic_array::GenericArrayImplEven<u8, generic_array::GenericArrayImplOdd<u8, [u8; 0]>> {parent1: generic_array::GenericArrayImplOdd<u8, [u8; 0]> {parent1: [], parent2: [], data: 80}, parent2: generic_array::GenericArrayImplOdd<u8, [u8; 0]> {parent1: [], parent2: [], data: 128}, _marker: core::marker::PhantomData<u8>}, parent2: generic_array::GenericArrayImplEven<u8, generic_array::GenericArrayImplOdd<u8, [u8; 0]>> {parent1: generic_array::GenericArrayImplOdd<u8, [u8; 0]> {parent1: [], parent2: [], data: 180}, parent2: generic_array::GenericArrayImplOdd<u8, [u8; 0]> {parent1: [], parent2: [], data: 126}, _marker: core::marker::PhantomData<u8>}, _marker: core::marker::PhantomData<u8>}, _marker: core::marker::PhantomData<u8>}, _marker: core::marker::PhantomData<u8>}}

That is not helpful at all :( It'd be great to have a gdb pretty-printer that understands GenericArray.

teythoon avatar May 16 '23 13:05 teythoon

As far as I know, there is nothing we can do in Rust code to aid in this.

novacrazy avatar May 16 '23 13:05 novacrazy

Rust 1.71.0 added the debugger_visualizer attribute which may finally be able to solve this.

novacrazy avatar Aug 15 '23 22:08 novacrazy

I did not mean to close this, mouse slipped.

novacrazy avatar Aug 15 '23 22:08 novacrazy

There are some examples here for std data structures: https://github.com/rust-lang/rust/blob/master/src/etc/gdb_providers.py

Perhaps at some point post-1.0 I can look into this more, but PRs are always welcome.

novacrazy avatar Aug 16 '23 20:08 novacrazy