How to handle different sizes of pointers in GDB?
Luis Machado
luis.machado@arm.com
Mon Aug 19 10:42:10 GMT 2024
On 8/19/24 11:20, Iru Cai via Gdb wrote:
> Hi,
>
> I'm porting GDB to a new architecture. Now the application for this
> architecture has two kinds of pointers in different sizes, one is 32-bit
> and one is 64-bit. I have done the following things:
>
> 1. I use set_gdbarch_addr_bit(gdbarch,64) and
> set_gdbarch_ptr_bit(gdbarch,64) to set both the addresses and the pointers
> 64-bit.
> 2. I tried to add a DW_AT_byte_size and DW_AT_address_class information
> under each of the pointer type with DW_TAG_pointer_type in the compiler for
> my new architecture.
>
> My program can be like this:
>
> int strlen32(const char *s) { /* s is 32-bit ... */ }
> int strlen64(const _PTR64 char *s) { /* s is 64-bit ... */ }
>
> However, GDB doesn't seem to get the correct type when printing the frame
> arguments in read_frame_arg(), when I debug into strlen32, GDB can make the
> GDB server crash because GDB is trying to read from a 64-bit address, which
> it thinks is the value of s. And when I debug this GDB read_frame_arg(), I
> see the type length of s in strlen32 is still 8 bytes.
>
> So is there anything missing to make GDB use the type length information
> from the DWARF debugging info?
>
> Regards,
> Iru
>From what I recall, you'll need to make sure your address class is correct in DWARF for the
different pointer types. Assuming that is correct, have you also implemented the 3 hooks
that deal with address classes?
set_gdbarch_address_class_type_flags
set_gdbarch_address_class_type_flags_to_name
set_gdbarch_address_class_name_to_type_flags
Check the s390 code for some reference in gdb/s390-tdep.c
Even with those set correct, gdb can still get confused with pointer sizes depending on
which gdb subsystem is handling it. The type information sometimes gets lost when we cross
some gdb internal boundaries, and then we fallback to the default pointer size.
I hope that helps some.
More information about the Gdb
mailing list