挥码枪(Nano Target Probe,NTP)是基于ARM CoreSight技术的硬件调试器, 其核心功能是通过CoreSight协议访问目标系统,实现系统调试和调优等功能。
拥有幽兰的同学可以通过挥马枪对幽兰进行调试,包括调试LINUX内核驱动、LINUX启动过程等。

1. 下载Nano Code

想要使用挥马枪进行JTAG调试,首先需要下载Nano Code,下载链接如下所示。
下载链接:https://www.nanocode.cn/#/download

2. 下载符号文件

在幽兰的机器上面默认附带了当前内核版本的符号文件,具体路径如下所示。

geduer@ulan:~$ ls /home/geduer/symbols/
boot.its  Module.symvers  vmlinux

下载符号文件:https://share.weiyun.com/cX4iGDRO
下载源代码:https://share.weiyun.com/HmBC4FSk

为了进行内核调试首先您需要将符号及源代码放到运行NanoCode的上位机。

3. 开启JTAG

为了能与目标系统建立JTAG会话,需要开启SOC的JTAG支持,开启方法有多种,我们建议你优先选择下面的第一种,如果第一种遇到问题,再尝试另外两种。
1)打开桌面上面的葫芦娃,点击JTAG Toggle,开启JTAG。

2)使用pangolin小程序开机JTAG。

sudo /opt/gedu/pangolin/pangolin 2

whether switch otg status: false
whether switch jtag status: true
current value of SOC_CON6 = 0x4740
value is set to = 0x40004000
current value of SOC_CON6 = 0x4740
current value of GPIO4D_IOMUX_SEL_L = 0x1111
value is set to = 0xff005500
current value of GPIO4D_IOMUX_SEL_L = 0x5511
whether switch sysrq status: false
the program will exit with exitno: 2

3)使用io命令开启JTAG。

sudo io -w -4 0xfd5f8098 0x55115511

4. 建立调试会话

  • 参照下方示意图连接挥马枪。

  • 将USB线的C口插入挥马枪内,A口则插入上位机。

  • 将挥马枪的SD卡插入幽兰的SD内。

  • 打开Nano Code,进入Nano 调试界面。

  • 选择内核调试,特别注意在targetname处添加yl(两个字符,幽兰的首字母,都是小写),其它参数设置如下图所示。

  • 点击启动。
Starting new session...Nano Debugger (NDB) 1.8.992 (11772:11852)Starting KD session type=usb,proto=ocd,opt=rxsb,targetname=yl
debug_level: 3

Applying symbol path used last time.
Symbol search path is: D:\gdk8\symbol;TGT*c:\symbols*;srv*c:\symbols* http://msdl.microsoft.com/download/symbols
Folder D:\gdk8\symbol is not accessible
Folder D:\gdk8\symbol is not accessible
Applying source path used last time.
Folder D:\gedu\ndp\Blink123 is not accessible
NDB Embassy Version 1.2.0002.9
NDB session started in 11772:9356(0x248c)

5. 发起中断和设置断点

发起中断后,如果能看到命令提示符,则代表中断成功。更多步骤请参照下方链接或者B站小视频进行设置。符号及源代码链接需要使用幽兰对应的符号及源代码链接。
加载符号与源代码相关命令为:

.sympath + 路径 //设置符号文件所在的文件夹路径 (加号可以省略)
.srcpath + 路径 //设置内核文件所在的文件夹路径

设置完成后使用.reload命令即可重新加载符号,输入lm时即可查看符号是否加载完成

.reload
Target: machine aa64, kernel  base 0xffffffc010010000, dbgdata 0xffffffc0095b89e0, modhead 0xffffffc0095b9180 orig 0xffffffc012bd5248, printk buffer 0xffffffc0132a5e10 length 0x40000
Connected to Linux 5.10 ARMv8 64-bit, 64bit
Loading modules in kernel space
.......
Loading unloaded module list
lm
start             end                 name
ffeeffee`80000000 ffeeffee`80a00000   nt           (deferred)                 
ffffffc0`09510000 ffffffc0`0951b000   autofs4      (deferred)                 
ffffffc0`0951c000 ffffffc0`095b0000   ipv6         (deferred)                 
ffffffc0`095b1000 ffffffc0`095b5000   dhd_static_buf     (deferred)                 
ffffffc0`095b6000 ffffffc0`095bb000   ndb          (deferred)                 
ffffffc0`095c1000 ffffffc0`0974a000   bcmdhd       (deferred)                 
ffffffc0`10010000 ffffffc0`1336b080   lk         T (pdb/dwarf symbols)        D:\uland\symbols\vmlinux

【挥马枪入门教程-设置断点】 https://www.bilibili.com/video/BV1b84y1J72L/?share_source=copy_web

常见问题

  • 无法找到ndb驱动
Failed to find NDB marker in target memory after scanning ...
If you are debugging Linux kernel, please make sure ndb.ko is loaded.

解决方案:
a. 在targetname处添加yl。

b. 如果仍有问题,可能是ndb驱动的地址发生了变化,请参照下方文章进行设置。

https://www.nanocode.cn/wiki/docs/gedu_ntp_wiki/ntp_set_scanbase

作者:李梓涌  创建时间:2023-05-02 09:04
最后编辑:张诗雨  更新时间:2024-05-06 17:42