如何使用GDB与vmlinux调试Zynq 7020内核驱动启动挂死问题
调试Zynq 7020内核启动阶段驱动挂死问题(GDB + vmlinux)
一、前期准备
- 确认Petalinux 2020.1项目已生成带完整调试信息的
vmlinux文件,路径通常为petalinux_project/build/tmp/work-shared/zynq-generic/kernel-build-artifacts/ - 配置U-Boot支持调试:编译U-Boot时开启
CONFIG_DEBUG_UART和CONFIG_CMD_GDB选项;若已编译完成,可通过U-Boot环境变量补全调试相关配置 - 连接调试链路:用串口线将板卡调试串口连至主机,确保板卡与主机网络互通(或准备JTAG调试器)
二、U-Boot阶段暂停内核启动并等待调试
- 启动板卡,在U-Boot启动倒计时阶段按任意键进入命令行
- 设置内核启动参数,强制内核启动早期暂停等待GDB连接:
setenv bootargs 'console=ttyPS0,115200n8 earlyprintk debug wait_for_debugger' saveenvwait_for_debugger:让内核在启动初期挂起,等待远程GDB连接earlyprintk:开启早期内核日志输出,便于定位启动阶段
- 按原有流程加载内核与设备树镜像(示例命令,需匹配你的存储介质与镜像路径):
fatload mmc 0 0x80000000 zImage fatload mmc 0 0x80F00000 devicetree.dtb - 启动内核,此时内核会进入等待状态:
bootm 0x80000000 - 0x80F00000
三、主机端启动GDB并连接调试
- 进入Petalinux交叉编译环境:
source petalinux_project/build/tmp/sysroots/x86_64-petalinux-linux/environment-setup-cortexa9t2hf-neon-xilinx-linux-gnueabi - 启动交叉GDB并加载
vmlinux:arm-xilinx-linux-gnueabi-gdb vmlinux - 建立远程连接:
- 网络调试(U-Boot需开启网络GDB服务):
target remote <板卡IP>:1234 - 串口调试:
target remote /dev/ttyUSB0 115200
- 网络调试(U-Boot需开启网络GDB服务):
- 设置断点并开始调试:
- 在自定义驱动初始化函数处设断点:
b my_custom_driver_init - 继续执行内核,触发断点后即可调试:
c
n、查看变量p <变量名>、查看调用栈bt、查看寄存器info registers等,定位挂死根源 - 在自定义驱动初始化函数处设断点:
四、额外调试技巧
- 若挂死在异步流程(如中断处理),可设置硬件断点或watchpoint监控关键变量
- 若内核无任何输出,可先在
start_kernel函数设断点,确认内核启动流程是否正常 - 调试过程中可结合串口输出的早期日志,缩小问题范围
内容的提问来源于stack exchange,提问作者ram
相关产品推荐
相关产品推荐

