在TRACE32中查看内存映射,先要分清自己要找的是调试器的访问配置、ELF文件的装载范围,还是程序运行时的地址转换关系。这几类地址放在一起比较,容易出现“地址对不上”的情况。下面从查看映射开始,逐项检查内存窗口中的异常显示。
一、TRACE32怎么查看内存映射
1、确认目标状态和待查地址
先确认调试器连接的目标和核心,再从芯片手册或工程文件中找出待查地址。目标运行时能否读取内存,取决于所用芯片和调试接口。
①查看TRACE32状态栏,确认当前连接状态和所选核心。
②对照芯片手册或链接文件,记下待查区域的起始地址与长度。
③若当前接口不支持运行中读取,点击工具栏【Break】暂停目标。
2、查看调试器的访问映射
MAP.List显示TRACE32内存映射器中的配置,包括已设置的访问限制;它并不是芯片的完整物理内存表。
①点击【命令输入栏】,输入MAP.List,按【Enter】。
②在映射窗口查找目标地址所在范围,核对该范围的属性。
③输入MAP.List<起始地址>,按【Enter】,查看指定地址附近的配置。
3、核对ELF装载范围与内存读数
程序装载到了哪里,需要另看符号映射。sYmbol.List.MAP可显示装载区段及顺序;Data.dump用于读取指定地址的内容。
①在【命令输入栏】输入sYmbol.List.MAP,按【Enter】,查找对应区段的装载地址。
②输入sYmbol.List.SECtion,按【Enter】,核对代码段或数据段的地址范围。
③依次点击【View】→【Dump...】,在【Address/Expression】填入待查地址。
④在【Width】选择【Byte】,点击【Ok】,记录显示的地址和字节值。
二、TRACE32内存地址显示异常如何检查
1、检查地址是否填错或超出范围
先把输入的地址与芯片手册、链接文件和ELF装载范围对照。程序使用的逻辑地址与下载时使用的地址,可能不是同一个数值。
①在【Address/Expression】重新输入完整地址,检查十六进制位数。
②查看sYmbol.List.MAP窗口,确认该地址是否位于预期区段。
③核对【Dump】窗口地址列前的地址类别前缀。
2、检查MMU地址转换
启用MMU后,需要区分逻辑地址和物理地址。TRANSlation.List显示调试器已建立的静态转换关系;具体页表还应结合当前处理器状态查看。
①在【命令输入栏】输入MMU.View,按【Enter】,查看MMU寄存器状态。
②输入TRANSlation.List,按【Enter】,查找对应的逻辑地址和物理地址范围。
③若使用Arm目标,输入MMU.List PageTable,按【Enter】,核对页表映射。
④若出现“no MMU table format defined”,返回【MMU.View】检查页表相关寄存器是否已初始化。
3、检查访问限制和总线错误
Data.dump显示“????????”时,可能是总线读取失败。地址不存在、访问受限,以及读取宽度或对齐方式不合适,都可能导致这种现象。
①输入MAP.List<异常地址>,按【Enter】,检查该范围的访问限制。
②打开Data.dump<异常地址>,将【Width】设为【Byte】,再次读取。
③在【命令输入栏】输入SYStem.LOG,按【Enter】。
④在日志窗口点击【Init】,将【log】设为【ON】,重新读取异常地址。
⑤输入SYStem.LOG.List,按【Enter】,查看出错的访问地址及反馈。
4、检查显示宽度与字节顺序
如果地址能够读取,但显示的数值与预期不符,先看原始字节,再看这些字节组合后的数值。读取外设寄存器时,还需遵守手册规定的访问宽度。
①在【Dump】窗口将【Long】改为【Byte】,逐字节记录内容。
②将显示宽度改为【Word】或【Long】,比较同一地址的数值。
③对照芯片手册中的端序和允许的访问宽度,再次读取该地址。
5、检查ELF与目标程序是否一致
地址可读而内容始终不对时,核对当前加载的ELF是否对应目标上运行的程序。还要查看是否有区段装载范围重叠。
①运行sYmbol.List.MAP,核对异常地址对应的区段及装载顺序。
②在【Dump】窗口读取该区段起始地址,与当前构建产物的预期字节比较。
③检查下载脚本中的ELF路径,选用本次构建的文件后重新核对。
三、如何确认调整已经生效
1、保存同一地址的排查记录
记录时统一地址、核心和目标运行状态,便于比较调整前后的结果,也便于其他人复现异常。
①记录异常地址、所属区段和【Dump】窗口中的显示内容。
②保存【MAP.List】、【sYmbol.List.MAP】及【TRANSlation.List】中对应的记录。
③对照芯片手册,标出地址范围或访问宽度不一致的地方。
2、按原条件复查
修改一处配置后,用同一地址和显示宽度重新读取,才能判断这次调整是否解决了问题。
①重新打开Data.dump<异常地址>,选择原先使用的【Width】。
②对照修改前的记录,检查地址列、读数和映射范围是否符合预期。
总结
调试内存问题时,沟通中最容易遗漏的是“这个地址指哪一种地址”。有人依据程序里的逻辑地址描述问题,有人拿芯片的物理地址核对,截图看起来相似,结论却可能不同。保留目标型号、所选核心、异常发生时的运行状态和原始读数,后续换版本或与同事交流时会更容易复现。希望本文能为大家使用TRACE32排查地址问题提供参考;如有TRACE32相关需求,欢迎联系我们咨询。