本篇继续学习:
- 使用Intel System Studio(ISS)来搭建远程调试目标机GDK7
- 尝试设置内核符号和源码
- 以及一些遇见的问题
必备环境
参考
https://software.intel.com/content/www/us/en/develop/documentation/system-debug-user-guide/top/jtag-debugging-specifics/jtag-debugging-requirements.html
需要目标机CPU支持JTAG调试;同时需要BIOS里打开DCI调试。
GDK7目标机是支持JTAG调试,并且BIOS默认是打开DCI的。
建立连接
1. 启动ISS,使用默认的workspace目录或者自己选择自定义工作目录,点击Launch。
2. 打开之后,选择右上角“Debug”选项。
3. 点击左侧“New Connection...”建立新连接。
4. 一直默认Next,到选择“Select a target”,选择CPU和连接方式。
5. Next之后,选择Finish,默认将自动连接。
6. 连接成功。
7. 建立连接之后,下次就可以直接选择后点击“连接”按钮了,如下:
8. 下面建立一个调试会话,点击下图“Debug”下拉->“Debug Configurations...”(同样,下次可直接使用)。
9. 选择调试类型,修改名称
10. 点击“Apply”,点击”Debug”开始调试,如下展示的信息:
11. 这样,可以在左边的“Debug View”里面中断/恢复/单步了。我们右键“SPT0”然后选择“Suspend”,看到所有CPU都暂停了,汇编窗口也打开了。
12. 至此,环境搭建结束。
13. 如果要停止调试,ISS先Resume目标机,点击断开连接。(断下的情况下,重启目标机会出现后面说的情况)
尝试加入符号和源代码
1. 在目标机上执行sudo cat /proc/kcore,在输出里面找到SYMBOL(_stext)=x,记录这个x,应该是内核的起始地址。
2. 准备好内核符号文件和源码,可参考(https://blog.csdn.net/henly1217/article/details/107662054)来下载,然后执行readelf vmlinux-x.x.x --debug | grep DW_AT_comp_dir来获取编译路径,输出了路径就可以ctrl+c readelf了,比如我的vm-linux-5.3.0-62-generic是/build/linux-hwe-eg6_iE/linux-hwe-5.3.0。
3. 准备就绪:
* 主机上已经有了源码目录和带符号的内核文件了;
* 记下了内涵起始地址;
* 记下了内核编译路径;
4. 重新编辑一下gdk7-debug
5. 选择“Symbol Files”,还要选择Debug context,指定哪个核?这里默认指定了第一个,然后点击Add...来添加:
6. 选择内核符号路径,输入刚刚看到的内核地址,然后OK。
7. 然后切换到Path Map属性表下,设置如下:
8. 设置完成之后,点击Apply, 在点击Continue.
9. 我们重新在Suspend一次目标机,看到的如下,汇编已经被源码替换了。“Debug View”的堆栈也清晰了,可以更方便地调试了。
出现的问题:
1. 在连接过程中,出现“No CPU threads...”,主机的设备管理器是正常的。
问题重现:
* ISS中点击“连接”后的表现:
17:10:54 [WARN ] TCA (server) - IPCConnection: Error querying device information: No error occurred.
17:10:54 [WARN ] TCA (server) - IPCConnection: Warning: Failed to detect PCH/Uncore TAP on the target. System Debug and System Trace might not work properly.
同时在点击Debug启动调试的时候,出现“No CPU threads on the target”。
如下图,点击右上角的倒数第二个“System Trace”按钮查看“Target Connection”,发现“Target Status”:“No Power”, “Core Status”:“Unknown”。
* NanoCode中的表现:
16:44:05#JTAG:Unable to perform operation because there are no GPC threads in this domain
尝试解决:
1. 搜索到
https://community.intel.com/t5/Intel-System-Studio/DCI-Connection-Problems/td-p/1160475
只是说BIOS是否开启DCI等等,GDK7默认是开启的。
2. 尝试在主机ISS上删除连接,重新建立一个连接(一样的错误)
3. 重启主机(还是一样的错误)
4. 重启目标机??(这样现场就没有了???)(还是一样的错误)
5. 等待明天来试试??
6. 目标机关机,也拔电了,等待第二天来试试
7. 第二天,结果,主机的设备管理器里面空空如也,没有发现“Intel DCI Transports(USB-Based)”,在“通用串行总线控制器”里面也没有发现设备。只能重新重启主机了。
8. 重启主机,果然,设备正常了
9. 下面使用ISS来连接目标机试试,成功连接了,虽然有其他报错。使用NanoCode来连接,也可以了。看到“Target Connection”里面的Target Status是OK,并且Core Status是Running,对比昨天是No Power和Unknown。
10. 通过实验,发现不正常的断开调试和强制重启目标机可能会触发这个错误,比如:在目标机断下的情况下,强制关闭目标机。今天由于一次意外,在断下的过程中,主机程序出现意外,无法恢复目标机,只能强制重启目标机,结果启动之后,就出现了上面的错误,心想,又要等一天???那不行啊!!!我就又尝试关闭目标机,然后断电,过了几分钟,重新开机,连接,竟然好了~~~。