This is the mail archive of the gdb@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Problem with breakpoint addresses


Hi,

I have a problem setting breakpoints from addresses stored in registers.

Here's an example:

(gdb) set $r1 = 0x80000000
(gdb) b *$r1
Breakpoint 2 at 0x80000000

The breakpoint looks like it is set correctly, but actually, if it is to work, I have to set it like this:

(gdb) b *($r1 & ~0U)
Breakpoint 3 at 0x80000000

This shows the difference:

(gdb) info breakpoints
Num Type           Disp Enb Address    What
2   breakpoint     keep y   0xffffffff80000000
3   breakpoint     keep y   0x80000000

The address has been sign extended. Note that there is no problem with registers of unsigned type. This is with an sh-elf target hosted on i686-pc-linux-gnu and using 'target sim'.

The effect of this is that the breakpoint is placed correctly, but, once hit, the program cannot continue or step any further.

The problem appears to be that the 32 bit address is used to set the breakpoint (i.e. the 64 bit address is truncated somewhere in the system), but when it is hit GDB does the address comparison and the addresses are not the same so the breakpoint is not recognised.

My question is: what is the _correct_ fix for this issue?

Should it never do sign extension? Should it always do sign extension? Is there some way to identify when it is intended and when not? Or perhaps the true problem is elsewhere entirely?

Andrew Stubbs


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]