Quec_Crane_Dump_Memory_Parse_Tool_v1.1.2 是一个使用 python 写的,解析ASR 平台 dump 的一个工具。通常在使用 trace 32 工具分析dump的时候,也结合 Quec_Crane_Dump_Memory_Parse_Tool 工具辅助分析。
Quec_Crane_Dump_Memory_Parse_Tool 只能根据 kernel.map 解析dump,而在app侧编译的app.map无法解析。kernel.map 是在 armcc 工具套件下编译生成的,而 app.map 则使用的是 armgcc 编译工具,二者生成的map文件格式有较大差异,Quec_Crane_Dump_Memory_Parse_Tool 没有支持 armgcc
生成的map文件,所以通过Quec_Crane_Dump_Memory_Parse_Too 解析的结果只包含kernel侧的信息,通常客户的代码是在 app 侧,如果问题发生在app侧,在分析时无法通过app侧的解析得到更多线索,这是这个工具存在的问题。
修改以支持app.map解析的方法
主要修改两个文件:_scripts/cp_dump.py 和 _scripts/cp_map.py
_scripts/cp_dump.py 里面去除只能解析一个map文件的限制,直接返回包含app.map和kernel.map这两个的文件的路径:
|
|
在 _scripts/cp_map.py 这个文件里面,分别加载kernel.map和app.map文件,并新增对 app.map 解析的方法,主要新增一个正则表达式用来提取app.map中的函数名、函数起始地址和函数的大小:
|
|
其中提取app.map中函数信息的正则表达式: \s+\.text\.(\w.*?)\n\s.*?0x(?!00000000)([0-9a-fA-F]+)\s+0x([0-9a-fA-F]+)(?:.*?\.o)
提取函数名、起始地址和函数大小,有这三个信息之后就可以根据内存地址找到对应的函数了。
结果对比
修改之后,output_all_task.txt 解析任务栈中函数调用关系的结果中,补充了app侧的函数调用。
output_osa_mem.txt 中也增加了在app侧申请内存的函数的显示。
Quec_Crane_Dump_Memory_Parse_Tool 工具的使用场景
排查内存泄漏问题和内存破坏问题
通过 output_osa_mem.txt 的解析结果定位内存泄漏和内存破坏的位置,以及内存申请失败问题。
排查中断、高优先级task 耗时长导致死机问题
output_rti_tsk.txt 解析结果记录了一段时间内任务调度的情况,其中包含每个task执行的耗时时间,从中可以判断和定位一些中断回调、高优先级task有阻塞动作导致的死机问题
查看死机时task的调用栈信息
output_all_task.txt 里面包含死机时函数的调用栈信息,在 trace 32 解析dump时看不到任务调用栈信息的情况下(比如 pc寄存器非法,调用栈为空的情况),这时可以通过output_all_task.txt看调用栈信息,可以定位出现问题的大致范围。
作为一种调试方法
主动触发dump,通过 output_rti_tsk.txt 查看任务切换的情况,调试多任务调度下的一些奇怪问题。
通过 output_all_task.txt, 除了可以查看当前死机的task,还可以查看其他task的信息,任务的优先级、任务栈大小和剩余大小和任务调用栈,通过这些信息也可以看下这些task的优先级和任务栈大小设置是否合理,以及task在休眠之前调用了哪些函数。