PS死机案例及原因发现方法浅析.ppt

上传人:牧羊曲112 文档编号:6516245 上传时间:2023-11-08 格式:PPT 页数:23 大小:272.49KB
返回 下载 相关 举报
PS死机案例及原因发现方法浅析.ppt_第1页
第1页 / 共23页
PS死机案例及原因发现方法浅析.ppt_第2页
第2页 / 共23页
PS死机案例及原因发现方法浅析.ppt_第3页
第3页 / 共23页
PS死机案例及原因发现方法浅析.ppt_第4页
第4页 / 共23页
PS死机案例及原因发现方法浅析.ppt_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《PS死机案例及原因发现方法浅析.ppt》由会员分享,可在线阅读,更多相关《PS死机案例及原因发现方法浅析.ppt(23页珍藏版)》请在三一办公上搜索。

1、PS 死机案例,系统死机的典型案例,取数据异常所有中断均失效只有ARM核运行栈溢出,界外数据被破坏数据越界访问中断被误打开,并没有清除中断不能等到寄存器置位或者清零函数重入问题函数声明和实现的接口不统一双处理器的同步问题,取数据异常,非法指令Function A()Function B()Struct*pStr=(Struct*)m_malloc(sizeof(Struct);pStr-pC=A;.m_free(pStr);/不小心free了pStr,这时候pStr指向的数据块已经被其他数据所填充.pStr-pC;/调用A,但实际跳转到其他地址,可能进入指令预取异常中断,或者未定义指令异常中断

2、,或者程序跑飞(最麻烦的),取数据异常,取数据异常中止(DataAbort)Function A()char*p=GetPointer(index);/GetPointer没有写好,返回了一个非法的地址(乱七八糟的数据).U8 q=*p;/CPU遇到从一个非法地址取数而产生DataAbort异常,注意:如果是p=NULL是不会产生异常中断的,必须是一个CPU认为的不能取数的地址,所有中断均失效,在607平台老的Framework 上,有两个现象在第一幅开机动画处死机反复播放前一段开机铃声任何按键没有反应,系统无任何中断产生,Melody部仅反复播放最开始送入的Midi数据,对用户来说是“死机”

3、,实际是ARM核在bloop()中执行有限的几行代码。,栈溢出,界外数据被破坏,/#define SMS_NUM 10/UTXXX SMS number#define SMS_NUM 50/UTXXX SMS number.Function A SMSLog smsSMS_NUM;/仅仅修改宏定义是不够的,必须察看与之有关的所有代码.memset(void*)sms,0 xFF,SMS_NUM*SMS_SiZE);/栈后面可能有其他全局量,被“无辜”的赋为0 xFF.,数据越界访问,Function A.m=m_malloc(size);m+;/不小心+,可能是其他方式导致其+memset(v

4、oid*)m,0,size);/堆中的数据被“无辜”破坏,数据越界访问,可以看到,紧挨在m后面的数据被无辜的破坏,导致系统在其他状态下“死机”。所有的赋值语句都要慎重,特别是对某一地址指向的一段数据进行赋值的时候要特别小心。,中断被误打开,且没有清除中断,Function A SetTimeXInt();/设置某个时钟,产生周期性中断 DisnableTimeXInt();/禁止该时钟中断(不需要该时钟).Function B DisnableAllInt();/禁止所有中断.EnableAllInt();/使能所有中断,误打开了TimeX中断,中断被误打开,且没有清除中断,如果不需要该时钟,

5、那么就要把时钟控制寄存器设置为禁止使能所有中断是危险的,必须使能那些需要使能的中断 U32 irqs=ReadIntEnableReg();WriteIntEnableReg(irqs);,使得该时钟中断频繁进入,几乎完全占用了CPU的MIPS,其他程序没有机会执行,从而表现出“死机”,不能等到寄存器置位或者清零,Function A while(1)if(U8)(*BBIO_XXXX_XXXX)=0 x01)break;/如果等不到这么办,不能等到寄存器置位或者清,#ifdef _DEBUGU32 nCount=0;#endifFunction A#ifdef _DEBUG nCount=0

6、;#endif while(1),一种可选的做法,#ifdef _DEBUG nCount+;if(nCountXXXX)ASSERT(0);/做一个超时保护#endif if(U8)(*BBIO_XXXX_XXXX)=0 x01)break;,函数重入的问题,Function A.*BBIO_XXXX_XXXX|=0 x08;/打开AD采样电路 while(*BBIO_YYYY_YYYY=0 x0b);/采样完成 vol=*BBIO_ZZZZ_ZZZZ;/得到电压*BBIO_XXXX_XXXX/关闭AD采样电路,如果函数c在调用A时,正在等待采样完成,被中断打断,函数D调用了A,完成采样之后

7、,把采样电路关闭了,这样函数c就永远无法从A出来了。,函数重入的问题,可以在函数内部增加调试代码,来找到重入的证据也可以在系统级别避免类似函数的重入问题(避免中断调用此函数)如果无法避免重入,那只好关中断了,函数声明和实现的接口不统一,XXX.hS8 A(U8 a,LP_U8 b,LP_U16 c);YYY.hU8 A(U8 a,LP_U8 b,LP_U16 c,U16 d);XXX.cS8 A(U8 a,LP_U8 b,LP_U16 c),双处理器的同步问题,双处理器的通信方式(串口,双口RAM等)造成不能同步的原因往往是数据Buffer溢出,或者中断丢掉数据Buffer大小的合理设定,考虑

8、“生产者”和“消费者”的活动状态;从系统角度考虑中断优先级的安排两边同步失调可能会造成死机,“死机”预防(最重要),绝大部分的“死机”可以通过仔细的设计和编码预防主动设置“陷阱”,主动增加调试代码,在任何程序不该进入的地方设置“陷阱”来“捕获”它,一旦捕获有更多的信息来分析(使用StackInsight工具)在一些看起来没有任何问题的地方也要设置“陷阱”(数据越界访问和栈溢出等导致看起来没有问题的地方也容易无辜牵连,这也是“死机”分析的突破口),“死机”预防,系统软件正常运行图,系统软件异常运行图,“死机”预防,主动设置“陷阱”后的图,陷阱,“陷阱”就是中止程序正常运行的代码。最常用的就是AS

9、SERT(0);或者软件中断或者reset系统(release),“死机”分析,必现或者容易重现的“死机”分析,(Debug,代码走读,案例套用,版本比较)落入陷阱的“死机”分析(StackInsight输出文件)没有落入陷阱的,又很难重现的“死机”分析(陷阱没有设置全,运气不好)。重复1-2个星期的专项测试,争取重现,如果还重现不了,就让领导拍板是否可以量产。,“死机”的“亡羊补牢”,“陷阱”处让系统resetWatchdog“偷偷”地reset,#ifdef _DEBUG#define ASSERT(x)DebugAssert(.)#else#define ASSERT(x)(if(FALSE=(U32)x)reset_req()#endif,提高“死机”分析的能力,扎实的基本功(C,汇编,硬件知识,各种仪器使用等)对系统的充分熟悉(BIOS,AP,Protocol,BBIC等)遇到问题多问“为什么”,并且找到真正的答案遇到问题,迎难而上,碰到难题应该庆幸,是提高自己的机会,“进一步海阔天空”StackInsight工具输出文件的熟练和完备的分析,谢谢!,谢谢!,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号