You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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阶段暂停内核启动并等待调试

  1. 启动板卡,在U-Boot启动倒计时阶段按任意键进入命令行
  2. 设置内核启动参数,强制内核启动早期暂停等待GDB连接:
    setenv bootargs 'console=ttyPS0,115200n8 earlyprintk debug wait_for_debugger'
    saveenv
    
    • wait_for_debugger:让内核在启动初期挂起,等待远程GDB连接
    • earlyprintk:开启早期内核日志输出,便于定位启动阶段
  3. 按原有流程加载内核与设备树镜像(示例命令,需匹配你的存储介质与镜像路径):
    fatload mmc 0 0x80000000 zImage
    fatload mmc 0 0x80F00000 devicetree.dtb
    
  4. 启动内核,此时内核会进入等待状态:
    bootm 0x80000000 - 0x80F00000
    

三、主机端启动GDB并连接调试

  1. 进入Petalinux交叉编译环境:
    source petalinux_project/build/tmp/sysroots/x86_64-petalinux-linux/environment-setup-cortexa9t2hf-neon-xilinx-linux-gnueabi
    
  2. 启动交叉GDB并加载vmlinux:
    arm-xilinx-linux-gnueabi-gdb vmlinux
    
  3. 建立远程连接:
    • 网络调试(U-Boot需开启网络GDB服务):
      target remote <板卡IP>:1234
      
    • 串口调试:
      target remote /dev/ttyUSB0 115200
      
  4. 设置断点并开始调试:
    • 在自定义驱动初始化函数处设断点:
      b my_custom_driver_init
      
    • 继续执行内核,触发断点后即可调试:
      c
      
    后续可使用GDB常用命令:单步执行n、查看变量p <变量名>、查看调用栈bt、查看寄存器info registers等,定位挂死根源

四、额外调试技巧

  • 若挂死在异步流程(如中断处理),可设置硬件断点或watchpoint监控关键变量
  • 若内核无任何输出,可先在start_kernel函数设断点,确认内核启动流程是否正常
  • 调试过程中可结合串口输出的早期日志,缩小问题范围

内容的提问来源于stack exchange,提问作者ram

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 12:25:33