各类概率性死机调试解决指南
📎 原始文档:https://www.kdocs.cn/l/cvoiXiM1yMAF bhmem各类概率性死机调试解决指南
一、PYPhmem excption
A、案例1 出现“除0”现象导致的异常死机
出现“除0”现象导致的异常死机,打印会报CPU0 div0_err。
出现该现象的死机是因为cpu在运算的时候,特别涉及到算法或者除法的时候,会出现除数为0的情况导致异常,我们的cpu除0就会异常,这是因为除数是不能等于0的,等于0是非法运算,一般可以根据异常的信息找到对应的异常位置处理即可,一般提示哪个cpu异常就看那个cpu的异常信息,这里查看cpu0的异常信息和对应的RETS和RETI两个的地址。

B、案例2
二、LAQ
A、案例1 来电拒接出现死机情况
- 看到客户反馈的信息,根据经验判断可能是通话后内存使用比较大,来不及释放就切换其他页面导致的死机。所以让客户定时或在死机之前打印打印一下内存状态。然后抓取异常中断信息和lst文件发过来。
- 拿到客户发过来的复位信息可以看到复位是指针操作不当导致。

- 通过lst文件定位和文本显示有关

- 推测存在的可能有客户显示的文本数组越界、客户使用的数组是否是局部变量或已经释放、客户显示是使用使用的控件已经不存在。这事需要看客户代码,可以在lst文件看到具体行数。
- 看客户代码是在其他地方调用了text的指针进行刷新控件,这时候指针是不确定的导致死机。

B、案例2 客户反馈手表sdk通话就会死机
死机问题先拿到客户的异常中断信息,没处理过这种问题先在开发板测试。分类是否是共性问题
- 开发板测试并不会出现通话死机的情况。
- 拿到客户异常中断信息分析发现是内存不足导致

- 确定内存不足看门狗复位后,再确认通话时客户使用的回音算法等级和我们的是否一致。一致后客户还是会出现,但是开发板不会出现的情况,就需要排查客户什么地方使用了内存。重点排查大数组、malloc不释放的情况,还要确定在刚刚经过的页面中一直不断操作是否有内存泄露的情况。
- 排查后并未出现内存泄露的情况,最后发现是客户tp数组定义为静态导致,需要加const修饰。

三、SCB
A、案例1 memcpy()操作越界
memcpy()操作越界,打印报堆栈溢出错误 CPU0 stack overflow err。
打印提示:
通过printf("%s,%d", func, LINE);定位到函数返回时死机
死机地址:RAM区
堆栈溢出:[0-CPU] emu err msg : CPU0 stack overflow err
屏蔽掉写VM的句子程序正常运行
结论:
间接原因:写VM与死机有关
主要原因:写VM之前的临时变量使用memcpy()赋值越界导致当前函数返回时出现堆栈溢出错误。
B、案例2 休眠后不能点亮屏幕与FLASH兼容性问题
701N开机画面正常,待机休眠后,不能再次点亮屏幕WDT复位与FLASH兼容性问题有关
打印提示:
[0]task02 wait pnd...
[0]task02 wait pnd timeout.
[0-CPU] emu err msg : system excption(系统异常)
[2-HSB] emu err msg : watchdog time out(看门狗复位)
原因是某些厂商flash进入休眠后退出休眠需要发送特定的指令,不然会出现指令没有反映的情况,从而导致系统读不了flash卡死。
建议
1、增加flash厂商提供的释放深度睡眠流程
2、更换另外厂家的flash测试
C、案例3 6958C软关机后一直wdt复位
6958C低电关机后一直wdt复位,与内部flash的cs PB7口没有维持有关系。
现象是上电或者进入关机,过8秒后系统复位,复位源看门狗进关机复位一直循环。原因是内部flash使用了A组SPI,关机时没有对A组CS PB7进行保护,设成高阻,导致内部flash读写异常卡死了触发WDT复位。
打印现象以及解决方法:
D、案例4 刷图频繁导致WDT复位
刷图频繁导致WDT复位,比如频繁滑动触摸切图导致的死机。
解决方法:降低刷图频率或刷图时清看门狗
E、案例5 变量指针赋值溢出
打印提示信息:
死机地址:RAM区
debug err msg : cpu_read_reserved_address(读到保留区地址)
Stack Magic destory!
Stack Magic0 destory!
案例6 6958C退出低功耗提示堆栈溢出有可能是dcdc切换导致问题
案例7 701N 偶然死机没有打印或者提示栈溢出有可能跟当前任务栈内存空间不足导致
各个任务的栈占用空间打印接口:
const int config_system_info = 1;
注册定时器,定时调用 void os_system_info_output(void)。
案例8 静态区变量一些数组越界操作导致其他变量被改
客户有个歌名变量定义只分配1byte,赋值越界了改到后面的g_alarm_active_flag变量,导致一系列的问题
可以通过lst文件查看前后相关的变量是否有溢出操作。
案例9 flash_common_write_packet返回0,进断言死机,可能和当前文件id前面push后导致

本文档为保密信息,未经授权,请勿转发或告知第三方。非常感谢!
This electronic documentation and any attachments are confidential and may be legally privileged or otherwise protected from disclosure. If you are not the intended recipient, please do not disclose the contents to anyone。
Thank you for your cooperation!
解析权归杰理所有!
The analysis right belongs to JieLi Technology Co., Ltd.