在多线程应用程序中使用GDB设置$ pc

时间:2019-05-17 20:04:44

标签: gdb riscv openocd

我正在调试多核RISCV复合系统。我已经通过OpenOCD将GDB附加到目标,并且每个核心/ HART都表示为一个线程。我正在尝试在Hart 2上调试一个小程序。最初,我想将hart 2上的$ pc设置为0x4000006a的新位置。在下面的日志中,您可以看到我从线程1(Hart 0)开始,然后切换到线程2(Hart 1)。

我使用线程套用2 p / x $ pc来获取当前程序计数器的位置,但是随后我尝试线程套用2 set $ pc = 0x4000006a,并且由于某种原因,它将线程1(Hart 0)设置为0x4000006a。 / p>

在多线程环境中使用GDB设置程序计数器的正确方法是什么?

0x0000000000000000 in ?? ()
(gdb) info threads
  Id   Target Id                                         Frame 
* 1    Thread 1 (Name: riscv.cpu0, state: debug-request) 0x0000000000000000 in ?? ()
  2    Thread 2 (Name: riscv.cpu1, state: debug-request) 0x0000000040000068 in ?? ()
  3    Thread 3 (Name: riscv.cpu2, state: debug-request) 0x0000000000000000 in ?? ()
  4    Thread 4 (Name: riscv.cpu3, state: debug-request) 0x0000000000000000 in ?? ()
  5    Thread 5 (Name: riscv.cpu4, state: debug-request) 0x0000000000000000 in ?? ()
(gdb) thread apply 2 symbol-file gaj-hello.elf 

Thread 2 (Thread 2):
Reading symbols from gaj-hello.elf...
(gdb) info threads                             
  Id   Target Id                                         Frame 
* 1    Thread 1 (Name: riscv.cpu0, state: debug-request) 0x0000000000000000 in ?? ()
  2    Thread 2 (Name: riscv.cpu1, state: debug-request) _start ()
    at /opt/SiFive/freedom-e-sdk/freedom-metal/gloss/crt0.S:57
  3    Thread 3 (Name: riscv.cpu2, state: debug-request) 0x0000000000000000 in ?? ()
  4    Thread 4 (Name: riscv.cpu3, state: debug-request) 0x0000000000000000 in ?? ()
  5    Thread 5 (Name: riscv.cpu4, state: debug-request) 0x0000000000000000 in ?? ()
(gdb) p /x $pc
$1 = 0x0
(gdb) thread apply 2 p /x $pc

Thread 2 (Thread 2):
$2 = 0x40000068
(gdb) thread 2
[Switching to thread 2 (Thread 2)]
#0  _start () at /opt/SiFive/freedom-e-sdk/freedom-metal/gloss/crt0.S:57
57    bnez a0, 1b
(gdb) p /x $pc               
$3 = 0x40000068
(gdb) thread apply 2 set $pc=0x4000006a

Thread 2 (Thread 2):
(gdb) p /x $pc                         
$4 = 0x40000068
(gdb) info threads
  Id   Target Id                                         Frame 
  1    Thread 1 (Name: riscv.cpu0, state: debug-request) _start ()
    at /opt/SiFive/freedom-e-sdk/freedom-metal/gloss/crt0.S:66
* 2    Thread 2 (Name: riscv.cpu1, state: debug-request) _start ()
    at /opt/SiFive/freedom-e-sdk/freedom-metal/gloss/crt0.S:57
  3    Thread 3 (Name: riscv.cpu2, state: debug-request) 0x0000000000000000 in ?? ()
  4    Thread 4 (Name: riscv.cpu3, state: debug-request) 0x0000000000000000 in ?? ()
  5    Thread 5 (Name: riscv.cpu4, state: debug-request) 0x0000000000000000 in ?? ()
(gdb) 

0 个答案:

没有答案