首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用JTAG + GDB调试Linux内核?

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

Unix & Linux用户
提问于 2020-10-25 09:22:00
回答 1查看 783关注 0票数 4

我已经成功地建立了与我的开发板的JTAG连接和串口连接。我遵循了下面的图表(有点不同)。

我的GDB_client在我的Linux主机上,但是我的OpenOCD在我的windows主机上,他们通过网络使用GDB_server进行通信。它们之间很容易通信,我可以通过我的Linux上的GDB通过JTAG将应用程序加载到我的板上。

这是我的平台规范:

代码语言:javascript
运行
复制
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复位信号重置您的板。您的引导加载程序将初始化您的板,执行将在内核开始时停止。之后,您可以将内核加载到内存中并运行它。

我将beak点放在内核的起点上,但问题是它不会停止在断点上让我将vmlinux文件加载到我的内存中。

这就是我要做的:

代码语言:javascript
运行
复制
(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

我也试过了,但是它并没有停在断点上:

代码语言:javascript
运行
复制
(gdb) break *0xD0008000
Breakpoint 9 at 0xd0008000: file arch/arm/kernel/head-nommu.S, line 61.

更新:

有时它工作,有时它不会。它似乎在重新设置我的董事会后,我应该立即暂停我的程序使用gdb,并再次恢复它使它工作。为什么会发生这种情况?

EN

回答 1

Unix & Linux用户

发布于 2021-05-31 08:14:30

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

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

我不知道这是不是该走的路,但我的直觉说,这个地址错配是断点没有被击中的原因。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/616277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档