使用Nuclei IDE调试N900内核Linux启动

Skip to content

Nuclei-Software/nuclei-linux-sdk

Type / to search

Debug Linuxsdk using NucleiStudio

Huaqi Fang edited this page on Nov 12, 2024 · 16 revisions

How to Debug Linux SDK on NucleiStudio

关于Nuclei Linux SDK的编译开发使用, 参见 https://github.com/Nuclei-Software/nuclei-linux-sdk

本文档主要说明如何调试在板子上运行的程序,调试原理是用pc端openocd做gdb server,接收pc端gdb发送过来的命令,通过jtag与板子进行通信,完成相应命令的处理。 关于openocd的具体工作原理不在本文介绍之列,可以网上自行查阅相关资料。

下面以调试Linux Kernel 为例子,说明如何使用NucleiStudio IDE来单步调试程序, 其他程序调试可以参考此文档。

关于基本的Nuclei Studio IDE的调试功能参见 2.9. Nuclei Studio 调试运行工程 --- Nuclei Development Tool Guide 2025.02 documentation

而Nuclei Studio IDE是基于Eclipse Embedded CDT项目,因此很多界面上的功能是一致的,所以搜索Eclipse CDT界面上相关调试使用技巧也基本适用,和具体硬件打交道的可能需要自行辨别下。

1.New Debug Configuration

和arm 调试工具类似,使用前需要配置调试参数。

  • 添加Debug Configuration

    双击NucleiStudio程序,进入如下界面,点击Run 可以看到有Debug Configurations 的选项。 点击Debug Configurations ,在左边界面找到GDB OpenOCD Debugging ,双击GDB OpenOCD Debugging , 或者右键可以创建新配置New_configuration 。右边选项卡Main, Debugger, Startup是需要配置的。如需要映射路径,Source也需要配置。CommonSVD Path 暂未用到。

  • 配置Main 选项卡

  • 配置Debugger 选项卡

    如果openocd 与gdb 不是同一台pc,则需要设置remote target 的IP地址。一般NucleiStudio IDE安装目录下有openocd与gdb这两个工具

    cfg文件在Linux SDK中conf/$SOC/ 目录下,例如 evalsoc 方案的cfg路径:nuclei-linux-sdk\conf\evalsoc\openocd.cfg

    下图中openocd 是修改过的,所以没有使用IDE中自带的openocd。

  • 配置Startup 选项卡

    如果需要加载符号表,需要选上Load Symbol

  • 配置Source 选项卡


下图中有两项path mapping 映射,理论上说,第一项就够了,但是本人电脑上需要创建第二个映射,原因未知。

第一次使用时可以不配置path mapping,调试器会提示你找不到汇编对应的文件,这个时候再编辑路径映射。

  • 其他选项卡

    Common,SVD Path 没有用到。Debug Config 编写完成后,可以点击Apply 来保存配置,点击Debug 则可以开始调试。

2.Debug Program

软件调试的一切前提是务必先排查FPGA SoC原型是否是稳定的,例如如果有DDR,务必确认DDR 8/16/32/64位读写执行(随机,按序)是PASS的没有任何错误的,在一个出错的环境上调试只会错上加错,一团乱麻,其他的外设也是如此,有条件先通过裸机都验证完毕再上Linux内核调试,且我们的原型环境是日常CI回归跑Linux的,所以一般而言不会有问题的。

IDE上调试和gdb 调试原理上是一样的,只是gdb 输入的是命令,IDE上是以图形化呈现功能,人机交互IDE界面会更友好一些。

如果想通过gdb加载opensbi/uboot/kernel/rootfs到DDR上,而不是freeloader的方式,请参见 https://github.com/Nuclei-Software/nuclei-linux-sdk/issues/23

Nuclei Studio IDE里面的 Debugger Console Tab里面是可以直接输入gdb命令的,关于gdb命令的使用参见 gdb手册 Top (Debugging with GDB) , 也可以网上查看gdb相关的使用方法,这里网上有很多教程,不予赘述。

Note

可以在Nuclei Studio IDE里面使能Instruction Step Mode来使能按指令单步,这样方便定位具体异常出错点

  • 启动调试功能

    方法1:在刚配置完debug configure之后直接点击右下角Debug 按钮,

    方法2:点击IDE主界面上靠右边的小虫子按钮,会弹出所有debug 配置项,选择对应配置项启动调试。

  • 修改PC指针

    下图Linux内核代码中加入了死循环asm volatile("j .")指令,让cpu运行到此处时停下来,jtag调试器连上开发板就可以从断点位置开始调试了,调试前需要将pc值加4,让cpu从下一条指令开始执行。可以在下一条汇编代码上,右击鼠标选择Move to Line 来完成pc+4的功能。如没有加死循环指令,jtag 调试器连接开发板就是连上那一刻pc指向的指令,这个时候不需要改pc值。

  • 设置断点


单步跟踪时,需要切换到按指令单步 模式,就是i-> 这个图标点击一下。在指令前双击可设置断点

  • 查看函数调用栈,寄存器,变量,断点,表达式,汇编

  • 查看内存

    内存地址可以是物理地址,也可以是虚拟地址(前提是系统开了MMU)

    如Memory 标签没有显示,可以在界面上选Window->Show View->Memory

  • 手动输入gdb 命令

3.QA

  • 1.单步调试出现断点异常提示

    出现这个错误提示,一般是跨image 调试时,出现此地址不在当前调试镜像内存范围内,所以跨镜像调试前,需要把断点删掉,以免出现错误调试。

  • 2.调试过程中重新加载符号表

    注意 : 调试符号表 使用的时候,请务必确保相关的代码编译的时候开启了 -g选项,最好调试优化等级能调整到 -Og 这样更方便源码对照。关于 opensbi/uboot/linux kernel如果开启调试选项,请自行搜索查找,这个和ARM基本一致。

    如果需要调试过程中,手动加载符号,可在Debugger Console 框中用symbol-file命令来更新符号表。
    symbol-file Y:\\home\\guibing\\nuclei-linux-sdk\\work\\evalsoc\\linux\\vmlinux

  • 3.调试过程中没有源码对应

    可能的情况

    • 1.编译,链接时没有加-g选项
    • 2.加载elf和源码不是同一个工程
  • 4.uboot 重定位后符号对不上如何调试

    可以先按键中断uboot的自动启动,使其停在uboot 控制台界面,然后在Debugger Console 中,输入如下命令获取符号偏移, 并使用-o 参数重新加载符号表,加载完成后,单步跟踪代码就可以对上。

复制代码
# 获取符号偏移
p /x ((gd_t*)$gp)->reloc_off
$2 = 0x7dd8e000
# 用-o 参数重新加载符号表
symbol-file Y:\\home\\guibing\\nuclei-linux-sdk\\work\\evalsoc\\u-boot\\u-boot -o 0x7dd8e000
Load new symbol table from "Y:\home\guibing\nuclei-linux-sdk\work\evalsoc\u-boot\u-boot"? (y or n) [answered Y; input not from terminal]
Reading symbols from Y:\home\guibing\nuclei-linux-sdk\work\evalsoc\u-boot\u-boot...
  • 5.怎么定位具体异常是啥

根据当前程序所在模式,通过执行 info reg priv 获取当前模式。

  • 例如 Machine(M) 模式,就查看CSR mepc mcause mtval 来分别获取异常出错前的位置,异常原因,异常出错信息
  • Supervisor(S) 模式,就查看CSR sepc scause stval相关寄存器来定位
  • 通过查看CSR mtvecstvec寄存器的值可以获知异常入口基地址,关于标准RISC-V异常CSR详细解析参见手册 riscv-privileged.pdf
  • Nuclei RISC-V处理器里面还额外定义了 mdcause/sdcause 来获知进一步异常的原因,详细参见 Nuclei_RISC-V_ISA_Spec.pdf

通过逐步分析异常出错的位置,反推上一级出错点,在对应的位置打断点,结合gdb 按指令单步(si)来具体定位出错点。

标准RISC-V CSR的详细解析请参见 riscv-privileged.pdf

Pages 4

Clone this wiki locally

© 2025 GitHub, Inc.

相关推荐
rqtz7 分钟前
【Linux-shell】探索Dialog 工具在 Shell 图形化编程中的高效范式重构
linux·运维·重构
行止628 分钟前
LVS+Keepalived高可用群集
linux·lvs·keepalived
风好衣轻1 小时前
【环境配置】在Ubuntu Server上安装5090 PyTorch环境
linux·pytorch·ubuntu
华清远见成都中心2 小时前
Linux嵌入式和单片机嵌入式的区别?
linux·运维·单片机·嵌入式
lisanmengmeng2 小时前
rabbitMQ 高可用
linux·分布式·rabbitmq
小妖6662 小时前
ubuntu 22.04 更换阿里源 (wsl2 参照)
linux·运维·ubuntu
凉、介2 小时前
SylixOS 下的消息队列
linux·wpf·sylixos
egoist20233 小时前
【Linux仓库】进程概念与基本操作【进程·贰】
linux·运维·服务器·指令·进程操作·理解进程
dessler3 小时前
ZooKeeper-监控(Monitor)
linux·运维·zookeeper
礼拜五&4 小时前
Linux进程间通信——信号
linux·内核·glibc·信号