一、死机的原因
断言: 所有软件引起的死机都是执行非法的指令或者非法的内存操作。
非法的内存操作比较常见,例如有内存溢出,内存反复释放,内存错误的读写,野指针的使用等。
非法的指令比较少见, 例如除零操作。
二、死机的调查方法
1. 确认是否进入mrc_init函数。
当没有进入mrc_init函数就已经死机了,可能的原因是不正确的打包方式、不稳定的SDK版本、不正确的环境配置。
首先排除sdk和环境配置问题,很简单只有拿一个正常程序(helloworld也行),在该SDK编译,如果能正常运行说明sdk和环境没有问题。
接着检查打包时的配置文件有没有写错。
常见的错误:
有arm模式和thumb模式一起使用。
展讯版本和MTK版本没有区分好。
插件化打包方式不正确。
2. 当程序成功进入mrc_init函数时,用log定位死机的位置。
根据现象知道程序死机的大概位置,有针对性地进行log的打印。
如果你什么都不知道那么从mrc_init开始着手,一个一个函数的定位。
定位以函数为单位,代码如下
FPRINTF(“main: in”);
main();
FPRINTF(“main: out”);
如果死机发生在main里,那么不会输出“main: out”这条信息。
通过这样的方法定位到具体的语句和底层函数为止。
3.用log定位死机的位置,但死机的位置经常变化怎么办?
这时要非常注意内存操作的函数和指令。
(责任编辑:凌云神风) |