本篇继续学习:

  • 使用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”选项。

  1. 点击左侧“New Connection…”建立新连接。

  1. 一直默认Next,到选择“Select a target”,选择CPU和连接方式。

  1. Next之后,选择Finish,默认将自动连接。

  1. 连接成功。

  1. 建立连接之后,下次就可以直接选择后点击“连接”按钮了,如下:

  1. 下面建立一个调试会话,点击下图“Debug”下拉->“Debug Configurations…”(同样,下次可直接使用)。

  1. 选择调试类型,修改名称

  1. 点击“Apply”,点击”Debug”开始调试,如下展示的信息:

  1. 这样,可以在左边的“Debug View”里面中断/恢复/单步了。我们右键“SPT0”然后选择“Suspend”,看到所有CPU都暂停了,汇编窗口也打开了。

  1. 至此,环境搭建结束。

  2. 如果要停止调试,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

  1. 选择“Symbol Files”,还要选择Debug context,指定哪个核?这里默认指定了第一个,然后点击Add…来添加:

  1. 选择内核符号路径,输入刚刚看到的内核地址,然后OK。

  1. 然后切换到Path Map属性表下,设置如下:

  1. 设置完成之后,点击Apply, 在点击Continue.

  2. 我们重新在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/Debugging-Linux-Hang-Apollo-Lake-CPU-Intel-System-Studio-DCI-DbC/td-p/1139171

    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)”,在“通用串行总线控制器”里面也没有发现设备。只能重新重启主机了。

  1. 重启主机,果然,设备正常了

  1. 下面使用ISS来连接目标机试试,成功连接了,虽然有其他报错。使用NanoCode来连接,也可以了。看到“Target Connection”里面的Target Status是OK,并且Core Status是Running,对比昨天是No Power和Unknown。

  1. 通过实验,发现不正常的断开调试和强制重启目标机可能会触发这个错误,比如:在目标机断下的情况下,强制关闭目标机。今天由于一次意外,在断下的过程中,主机程序出现意外,无法恢复目标机,只能强制重启目标机,结果启动之后,就出现了上面的错误,心想,又要等一天???那不行啊!!!我就又尝试关闭目标机,然后断电,过了几分钟,重新开机,连接,竟然好了~
作者:沈根成  创建时间:2024-03-20 14:36
最后编辑:沈根成  更新时间:2024-04-26 11:30