如何使用GDB使用SMP(对称多处理器)调试QEMU?

时间:2017-03-15 03:52:12

标签: c debugging gdb qemu xv6

我是一个研究生操作系统类,我们使用QEMU模拟我们的内核,并使用gdb进行调试。调试已经足够直截了当......直到现在。如何将gdb连接到我在QEMU中运行的其他CPU?

我们的makefile允许我们用" make qemu-nox"来启动qemu。或者"制作qemu-nox-gdb"在一个终端中,如果我们使用后者,那么使用" gdb"与gdb连接到它。在另一个终端(在同一目录中)。因此,我不太确定如何再次连接到相同的QEMU,而是连接到不同的处理器(我现在一共运行4个)。

1 个答案:

答案 0 :(得分:7)

每个qemu CPU在gdb中作为单独的线程可见。要检查另一个CPU的状态,请使用thread命令切换CPU。

(gdb) info thread
  Id   Target Id         Frame 
* 1    Thread 1 (CPU#0 [running]) 0x80105163 in stosl (addr=0x89c3e000, data=16843009, cnt=1024) at x86.h:44
  2    Thread 2 (CPU#1 [halted ]) halt () at x86.h:127
  3    Thread 3 (CPU#2 [halted ]) halt () at x86.h:127
  4    Thread 4 (CPU#3 [halted ]) halt () at x86.h:127

(gdb) where
#0  0x80105163 in stosl (addr=0x89c3e000, data=16843009, cnt=1024) at x86.h:44
#1  0x801051bf in memset (dst=0x89c3e000, c=1, n=4096) at string.c:8
#2  0x80102b5a in kfree (v=0x89c3e000 "\001\001\001\001") at kalloc.c:63
#3  0x80102af4 in freerange (vstart=0x80400000, vend=0x8e000000) at kalloc.c:47
#4  0x80102ac1 in kinit2 (vstart=0x80400000, vend=0x8e000000) at kalloc.c:38
#5  0x8010386a in main () at main.c:37

(gdb) thread 3
[Switching to thread 3 (Thread 3)]
#0  halt () at x86.h:127
127 }

(gdb) where
#0  halt () at x86.h:127
#1  0x80104aeb in scheduler () at proc.c:288
#2  0x801038f6 in mpmain () at main.c:59
#3  0x801038b0 in mpenter () at main.c:50
#4  0x0000705a in ?? ()