-
Notifications
You must be signed in to change notification settings - Fork 15
Debug Linuxsdk using NucleiStudio
关于Nuclei Linux SDK的编译开发使用, 参见 https://github.com/Nuclei-Software/nuclei-linux-sdk
本文档主要说明如何调试在板子上运行的程序,调试原理是用pc端openocd做gdb server,接收pc端gdb发送过来的命令,通过jtag与板子进行通信,完成相应命令的处理。 关于openocd的具体工作原理不在本文介绍之列,可以网上自行查阅相关资料。
下面以调试Linux Kernel 为例子,说明如何使用NucleiStudio IDE来单步调试程序, 其他程序调试可以参考此文档。
和arm 调试工具类似,使用前需要配置调试参数。
-
添加Debug Configuration
双击NucleiStudio程序,进入如下界面,点击Run 可以看到有Debug Configurations的选项。 点击Debug Configurations,在左边界面找到GDB OpenOCD Debugging,双击"GDB OpenOCD Debugging", 或者右键可以创建新配置New_configuration。右边选项卡Main, Debugger, Startup是需要配置的。如需要映射路径,Source也需要配置。Common,SVD Path 暂未用到。


-
配置Main 选项卡

-
配置Debugger 选项卡
如果openocd 与gdb 不是同一台pc,则需要设置remote target 的IP地址。一般NucleiStudio IDE安装目录下有openocd与gdb这两个工具
cfg文件在Linux SDK中conf/$SOC/目录下,例如demosoc 方案的cfg路径:nuclei-linux-sdk\conf\demosoc\openocd.cfg
下图中openocd 是修改过的,所以没有使用IDE中自带的openocd。

-
配置Startup 选项卡
如果需要加载符号表,需要选上Load Symbols

-
配置Source 选项卡
下图中有两项path mapping 映射,理论上说,第一项就够了,但是本人电脑上需要创建第二个映射,原因未知。
第一次使用时可以不配置path mapping,调试器会提示你找不到汇编对应的文件,这个时候再编辑路径映射。

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

IDE上调试和gdb 调试原理上是一样的,只是gdb 输入的是命令,IDE上是以图形化呈现功能,人机交互IDE界面会更友好一些。
-
启动调试功能
方法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 命令

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