如何使用JTAG + GDB调试Linux内核?

如何使用JTAG + GDB调试Linux内核?

我已成功与我的开发板建立 JTAG 连接和串行端口连接。我遵循了下图(有一点区别)。

我的GDB_客户端在我的 Linux 主机上,但是我的开放强迫症位于我的 Windows 主机上,它们使用以下方式相互通信GDB服务器通过网络。他们可以轻松地相互通信,我可以通过以下方式将应用程序加载到我的板上广东发展银行在我的 Linux 上通过 JTAG。

1

这是我的平台规格:

SOC: STM32H743 (Cortex m7 single core -> ARMv7E-M)
Internal Flash: 2MB (only u-boot is in the flash memory)
Board: Waveshare CoreH7XXI dev board
On-board DRAM: 8MB
SDCARD: 1GB (the ROOTFS and Linux kernel are in the SD card)
Bootloader: mainline U-boot
kernel:     mainline Linux kernel

Debug Probe: STLink V2

根据本指南: 将内核加载到内存中 一旦您习惯使用 gdb 来调试内核,您就会希望使用 gdb 直接将内核加载到您的目标上。最实用的方法是在内核启动时设置硬件断点,并使用 JTAG 重置信号重置您的主板。您的引导加载程序将初始化您的主板,并且执行将在内核启动时停止。之后,您可以将内核加载到内存中并运行它。

我把喙点放在内核的起点上,但问题是它不会在断点处停止让我加载虚拟机Linux文件到我的记忆中。

这就是我正在做的:

(gdb) file vmlinux
(gdb) target remote 192.168.1.53:8888
(gdb) break __init_begin
(gdb) cont
(gdb) mon reset #perhaps this needs to be done from the openocd telnet session..
Breakpoint 1, 0xc0008000 in stext ()
(gdb) load vmlinux

我也尝试过这个,但同样,它没有在断点处停止:

(gdb) break *0xD0008000
Breakpoint 9 at 0xd0008000: file arch/arm/kernel/head-nommu.S, line 61.

更新:

有时有效,有时无效。看来重置我的主板后,我应该使用 gdb 快速暂停我的程序,然后再次恢复它以使其工作。为什么会发生这种情况?

答案1

您是否尝试过禁用“kaslr”选项?我也试图设置一个断点,但我的断点从未命中。我尝试通过在 bootargs 中传递“nokaslr”来禁用它,但这不会生效。我假设它没有生效,因为在目标板上(Xilinx Zynq Ultrascale+)我仍然看到选择了“完全随机化”选项。

我用cat /proc/sys/kernel/randomize_va_space在目标板上。

我不确定这是否是正确的方法,但我的直觉告诉我,地址不匹配是断点未被命中的原因。

相关内容