How to print local variables in GDB

Using spike + gdb to debug my code. But the local variables in main function can be printed in gdb. Got some error messages like

Cannot access memory at address 0x7ffffd8c

How to check local variables in gdb?

That address is not a legal address. What variable are you trying to print, and what is its expected address (is it on the stack, in flash, etc)?

If you’re trying to debug something specifically from the freedom-e-sdk, please let us know the exact commands you’re trying and we’ll see if we can reproduce it.

The C code is very simple. Variable “i” is inside main function and its address is in stack.

volatile int flag = 1;

int main()
{
int i=9999;

while(flag) ;
}

In Spike, the sp value is 7ffffd80.

: reg 0
zero: 0x0000000000000000 ra : 0x0000000000010044 sp : 0x000000007ffffd80 gp : 0x000000000001c880

Now the program is stop at the “while” statement. If try “p i” in gdb, the error will jump out

Cannot access memory at address 0x7ffffd8c

If I turning on debug mode of spike, here are messages printed by spike after getting “p i” command from gdb.

Received 5-byte packet from debug client: $g#67
register_read step 0
wrote 10 bytes: +$00000000
register_read step 1
read32(4) -> 0x10044
read32(5) -> 0x7ffffd80
wrote 16 bytes: 4400010080fdff7f
register_read step 2
read32(4) -> 0x1c880
read32(5) -> 0x0
wrote 16 bytes: 80c8010000000000
register_read step 3
read32(4) -> 0x1c160
read32(5) -> 0x1c160
wrote 16 bytes: 60c1010060c10100
register_read step 4
read32(4) -> 0x0
read32(5) -> 0x7ffffda0
wrote 16 bytes: 00000000a0fdff7f
register_read step 5
read32(4) -> 0x0
read32(5) -> 0x1
wrote 16 bytes: 0000000001000000
register_read step 6
read32(4) -> 0x7ffffda4
read32(5) -> 0x0
wrote 16 bytes: a4fdff7f00000000
register_read step 7
read32(4) -> 0x0
read32(5) -> 0x0
wrote 16 bytes: 0000000000000000
register_read step 8
read32(4) -> 0x1
read32(5) -> 0x0
wrote 16 bytes: 0100000000000000
register_read step 9
read32(4) -> 0x0
read32(5) -> 0x0
wrote 16 bytes: 0000000000000000
register_read step 10
read32(4) -> 0x0
read32(5) -> 0x0
wrote 16 bytes: 0000000000000000
register_read step 11
read32(4) -> 0x0
read32(5) -> 0x0
wrote 16 bytes: 0000000000000000
register_read step 12
read32(4) -> 0x0
read32(5) -> 0x0
wrote 16 bytes: 0000000000000000
register_read step 13
read32(4) -> 0x0
read32(5) -> 0x0
wrote 16 bytes: 0000000000000000
register_read step 14
read32(4) -> 0x0
read32(5) -> 0x0
wrote 16 bytes: 0000000000000000
register_read step 15
read32(4) -> 0x0
read32(5) -> 0x0
wrote 16 bytes: 0000000000000000
register_read step 16
read32(4) -> 0x0
wrote 11 bytes: 00000000#6c
Received 16-byte packet from debug client: $m7ffffd80,40#98
wrote 1 bytes: +
read32(4) -> 0x80011
read32(4) -> 0x20005401
pte_cache[0x800117fc] = 0x20005401
read32(4) -> 0x401e40df
pte_cache[0x80015ffc] = 0x401e40df
gdbserver translate 0x7ffffd80 -> 0x100790d80
read32(15) -> 0xffffffff
wrote 7 bytes: $E99#b7
Received 15-byte packet from debug client: $m7ffffd9c,4#9c
wrote 1 bytes: +
gdbserver translate 0x7ffffd9c -> 0x100790d9c
read32(15) -> 0xffffffff
wrote 7 bytes: $E99#b7
Received 16-byte packet from debug client: $m7ffffd80,40#98
wrote 1 bytes: +
gdbserver translate 0x7ffffd80 -> 0x100790d80
read32(15) -> 0xffffffff
wrote 7 bytes: $E99#b7
Received 15-byte packet from debug client: $m7ffffd9c,4#9c
wrote 1 bytes: +
gdbserver translate 0x7ffffd9c -> 0x100790d9c
read32(15) -> 0xffffffff
wrote 7 bytes: $E99#b7
Received 16-byte packet from debug client: $m7ffffd80,40#98
wrote 1 bytes: +
gdbserver translate 0x7ffffd80 -> 0x100790d80
read32(15) -> 0xffffffff
wrote 7 bytes: $E99#b7
Received 15-byte packet from debug client: $m7ffffd9c,4#9c
wrote 1 bytes: +
gdbserver translate 0x7ffffd9c -> 0x100790d9c
read32(15) -> 0xffffffff
wrote 7 bytes: $E99#b7
Received 16-byte packet from debug client: $m7ffffd80,40#98
wrote 1 bytes: +
gdbserver translate 0x7ffffd80 -> 0x100790d80
read32(15) -> 0xffffffff
wrote 7 bytes: $E99#b7
Received 15-byte packet from debug client: $m7ffffd9c,4#9c
wrote 1 bytes: +
gdbserver translate 0x7ffffd9c -> 0x100790d9c
read32(15) -> 0xffffffff
wrote 7 bytes: $E99#b7
Received 16-byte packet from debug client: $m7ffffd80,40#98
wrote 1 bytes: +
gdbserver translate 0x7ffffd80 -> 0x100790d80
read32(15) -> 0xffffffff
wrote 7 bytes: $E99#b7
Received 15-byte packet from debug client: $m7ffffd8c,4#9b
wrote 1 bytes: +
gdbserver translate 0x7ffffd8c -> 0x100790d8c
read32(15) -> 0xffffffff
wrote 7 bytes: $E99#b7

It seems that spike does not translate the memory address well and return an error to gdb.