How to get past ebreak instruction on RISC-V
Andrew Burgess
andrew.burgess@embecosm.com
Tue Jan 12 16:56:26 GMT 2021
* Simon Marchi via Gdb <gdb@sourceware.org> [2021-01-12 11:15:37 -0500]:
>
>
> On 2021-01-12 11:07 a.m., Jan Vrany wrote:
> > Hi,
> >
> > I'm working on RISC-V compiler. To ease debugging of compiled code
> > I'm inserting `ebreak` instruction to interesting place (entry/exit
> > points or as a placeholder for unimplemented features).
> >
> > For example, the code might look like:
> >
> > (gdb) disas 0x0000003FD6A36024, 0x0000003FD6A36048
> > Dump of assembler code from 0x3fd6a36024 to 0x3fd6a36048:
> > => 0x0000003fd6a36024: ebreak
> > 0x0000003fd6a36028: sd ra,-8(s11)
> > 0x0000003fd6a3602c: addi s11,s11,-16
> > 0x0000003fd6a36030: ld t3,80(s10)
> > 0x0000003fd6a36034: addiw a0,zero,42
> > 0x0000003fd6a36038: addi s11,s11,16
> > 0x0000003fd6a3603c: ret
> > 0x0000003fd6a36040: blt s11,t3,0x3fd6a36000
> > 0x0000003fd6a36044: ebreak
> > End of assembler dump.
> > (gdb)
> >
> > When compiled function is (attempted to) run, it stops on `ebreak`
> > as expected:
> >
> > Thread 2 "main" received signal SIGTRAP, Trace/breakpoint trap.
> > [Switching to Thread 0x3ff7e681e0 (LWP 428777)]
> > 0x0000003fd6a36024 in ?? ()
> >
> > How can I get past the `ebreak` so I can `stepi` thought the following
> > instructions and debug? Thanks!
>
> I suppose you could do "set $pc = 0x3fd6a36028". But really this is
> something that GDB should be doing automatically, adjusting the PC
> after hitting that style of breakpoint.
If you place a breakpoint at the location of the ebreak then GDB will
spot that there is already an ebreak there and will do the right
thing. That is, it will treat it like a breakpoint, including being
able to step over the breakpoint correctly, but will not get confused
by the fact that there's no "real" instruction to execute at this
address.
Here's a sample session:
(gdb) target sim
Connected to the simulator.
(gdb) load
Loading section .text, size 0x20 lma 0x10054
Start address 0x10054
Transfer rate: 256 bits in <1 sec.
(gdb) x/10i 0x10054
0x10054 <_start>: nop
0x10058 <_start+4>: nop
0x1005c <_start+8>: nop
0x10060 <_start+12>: ebreak
0x10064 <_start+16>: nop
0x10068 <_start+20>: nop
0x1006c <_start+24>: nop
0x10070 <_start+28>: ebreak
0x10074: unimp
0x10076: unimp
(gdb) break *0x10060
Breakpoint 1 at 0x10060
(gdb) r
Starting program: /home/andrew/projects/riscv-gdb/tmp/test.x
Breakpoint 1, 0x00010060 in _start ()
(gdb) c
Continuing.
Program received signal SIGTRAP, Trace/breakpoint trap.
0x00010070 in _start ()
(gdb) x/10i 0x10054
0x10054 <_start>: nop
0x10058 <_start+4>: nop
0x1005c <_start+8>: nop
0x10060 <_start+12>: ebreak
0x10064 <_start+16>: nop
0x10068 <_start+20>: nop
0x1006c <_start+24>: nop
=> 0x10070 <_start+28>: ebreak
0x10074: unimp
0x10076: unimp
(gdb)
Thanks,
Andrew
More information about the Gdb
mailing list