added debugging info
parent
cd08cd4f70
commit
bf4bcfe388
Binary file not shown.
After Width: | Height: | Size: 195 KiB |
@ -0,0 +1,63 @@
|
|||||||
|
# Using the debugger
|
||||||
|
|
||||||
|
You are launched into the debugger either by an `ebreak/sbreak` instruction, or when an exception occurs while running executing instructions.
|
||||||
|
|
||||||
|
Consider the example programm `examples/fibs.asm`:
|
||||||
|
|
||||||
|
```asm riscv-asm
|
||||||
|
.data
|
||||||
|
fibs: .space 56
|
||||||
|
|
||||||
|
.text
|
||||||
|
main:
|
||||||
|
addi s1, zero, 0 ; storage index
|
||||||
|
addi s2, zero, 56 ; last storage index
|
||||||
|
addi t0, zero, 1 ; t0 = F_{i}
|
||||||
|
addi t1, zero, 1 ; t1 = F_{i+1}
|
||||||
|
loop:
|
||||||
|
sw t0, fibs(s1) ; save
|
||||||
|
add t2, t1, t0 ; t2 = F_{i+2}
|
||||||
|
addi t0, t1, 0 ; t0 = t1
|
||||||
|
addi t1, t2, 0 ; t1 = t2
|
||||||
|
addi s1, s1, 4 ; increment storage pointer
|
||||||
|
blt s1, s2, loop ; loop as long as we did not reach array length
|
||||||
|
; exit gracefully
|
||||||
|
ebreak ; launch debugger
|
||||||
|
addi a0, zero, 0
|
||||||
|
addi a7, zero, 93
|
||||||
|
scall ; exit with code 0
|
||||||
|
```
|
||||||
|
|
||||||
|
This calculates the fibonacci sequence and stores it in memory at `fibs`. After it calculated all fibonacci numbers, it
|
||||||
|
uses the `ebreak` instruction to open the debugger. Let's run it and see what happens:
|
||||||
|
|
||||||
|
```
|
||||||
|
> python -m riscemu examples/fibs.asm
|
||||||
|
Successfully loaded: LoadedExecutable[examples/fibs.asm](base=0x00000100, size=72bytes, sections=data text, run_ptr=0x00000138)
|
||||||
|
Debug instruction encountered at 0x00000143
|
||||||
|
>>>
|
||||||
|
```
|
||||||
|
|
||||||
|
In this interactive session, you have access to the cpu, registers, memory and syscall interface. You can look into everything,
|
||||||
|
and most common tasks should have helper methods for them.
|
||||||
|
|
||||||
|
Available objects are:
|
||||||
|
|
||||||
|
* `mem`: (aka `mmu` or `memory`)
|
||||||
|
* `dump(address, fmt='hex', max_rows=10, group=4, bytes_per_row=16, all=False`:
|
||||||
|
Dumps the memory at `address`, in at most `max_rows` rows, each containing `bytes_per_row` bytes grouped
|
||||||
|
into groups of `group` bytes. They can be printed as:
|
||||||
|
* `hex`: hexadecimal, unsigned
|
||||||
|
* `int`: converted to integers
|
||||||
|
* `uint`: converted to unsigned integers
|
||||||
|
* `symbol(name)`: Lookup all symbols named `name`
|
||||||
|
* `reg`: (aka `regs` or `registers`)
|
||||||
|
* `dump(full=False)` dumps all integer registers (unless `all` is true, then all registers are printed)
|
||||||
|
* `get(name)` get register content
|
||||||
|
* `set(name, val)` set register content
|
||||||
|
* `cpu`:
|
||||||
|
* The CPU has the `pc` attribute and `cycle` attribute. Others won't be useful in this context.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
![debuggin the fibs program](debug-session.png)
|
@ -0,0 +1,24 @@
|
|||||||
|
; Example program (c) by Anton Lydike
|
||||||
|
; this calculates the fibonacci sequence and stores it in ram
|
||||||
|
|
||||||
|
.data
|
||||||
|
fibs: .space 56
|
||||||
|
|
||||||
|
.text
|
||||||
|
main:
|
||||||
|
addi s1, zero, 0 ; storage index
|
||||||
|
addi s2, zero, 56 ; last storage index
|
||||||
|
addi t0, zero, 1 ; t0 = F_{i}
|
||||||
|
addi t1, zero, 1 ; t1 = F_{i+1}
|
||||||
|
loop:
|
||||||
|
sw t0, fibs(s1) ; save
|
||||||
|
add t2, t1, t0 ; t2 = F_{i+2}
|
||||||
|
addi t0, t1, 0 ; t0 = t1
|
||||||
|
addi t1, t2, 0 ; t1 = t2
|
||||||
|
addi s1, s1, 4 ; increment storage pointer
|
||||||
|
blt s1, s2, loop ; loop as long as we did not reach array length
|
||||||
|
; exit gracefully
|
||||||
|
ebreak ; launch debugger
|
||||||
|
addi a0, zero, 0
|
||||||
|
addi a7, zero, 93
|
||||||
|
scall ; exit with code 0
|
Loading…
Reference in New Issue