Установка $ pc с помощью GDB в многопоточном приложении - PullRequest
0 голосов
/ 17 мая 2019

Я отлаживаю многоядерный RISCV комплекс. Я подключил GDB к цели через OpenOCD, и каждое ядро ​​/ HART представлено в виде потока. Я пытаюсь отладить небольшую программу на Hart 2. Изначально я хочу установить $ pc на HART 2 на новое место, которое находится в 0x4000006a. В журнале ниже вы можете видеть, что я начинаю с темы 1 (Hart 0), а затем переключаюсь на тему 2 (Hart 1).

Я использую thread apply 2 p / x $ pc, чтобы получить текущее положение счетчика программы, но затем я пытаюсь применить поток, используя 2 set $ pc = 0x4000006a, и по любой причине он устанавливает thread1 (Hart 0) в 0x4000006a.

Как правильно установить счетчик программ с использованием 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) 
...