Jarvis's Blog

白帽子、全栈、IoT安全专家、嵌入式系统专家

MTK功能机平台死机原因调试方法

最近在做IOT模块,用的MTK的方案,有时候会发现自己写的程序跑着跑着就崩掉了,这时候如果用catcher连上去调试,崩溃的时候catcher会打印调用堆栈:

116 Trace 8105 19:36:48:582 2017/09/19 MOD_NIL TRACE_ERROR 0x100278C4
117 Trace 8109 19:36:48:582 2017/09/19 MOD_NIL TRACE_ERROR 0x1001F490
118 Trace 8112 19:36:48:613 2017/09/19 MOD_NIL TRACE_ERROR 0xF01CAFC6
119 Trace 8115 19:36:48:629 2017/09/19 MOD_NIL TRACE_ERROR 0xF013F6CC
120 Trace 8117 19:36:48:629 2017/09/19 MOD_NIL TRACE_ERROR 0xF012AC70
121 Trace 8121 19:36:48:660 2017/09/19 MOD_NIL TRACE_ERROR 0xF0124C00
122 Trace 8123 19:36:48:675 2017/09/19 MOD_NIL TRACE_ERROR 0xF011BF98
123 Trace 8127 19:36:48:675 2017/09/19 MOD_NIL TRACE_ERROR 0x10013128
124 Trace 8130 19:36:48:707 2017/09/19 MOD_NIL TRACE_ERROR 0x10031B10
125 Trace 8134 19:36:48:722 2017/09/19 MOD_NIL TRACE_ERROR 0x00000000

这个堆栈怎么用呢,主要是从上往下看,最顶上那个是最后调用的函数,但是只有地址我们怎么确定是哪个函数呢,这个就要通过我们编译出来的的符号文件来看了,在编译出来的build文件夹下面,会有个类似MTK03D_M2M_11C_PCB01_gprs_MT6261_S00.sym这种的符号文件,我们打开可以看到有地址对应的函数名称,我们从出错调用栈从上到下查询,首先我们看0x100278C4,如果搜索不到,可以把地址+1,因为有可能这个函数是Thumb指令编译的,我们搜索0x100278C5可以找到:


0x100278c5 T tst_log_primitive_without_filter_check

其中那个T表示这个是Thumb指令的函数,这个函数是打印系统最后出错日志的函数,对我们没帮助,所以继续往下,看0x1001F490,可以找到

0x1001F491 T time

可以看到出错原因是因为调用了MTK平台废弃的系统函数time引起的,继续找是谁调用了这个函数,再看地址0xF01CAFC6,可以找到:

 
0xF01CAFC7 T LowResTimer 

这时候就找到我有问题的用户函数了,把time(0)用系统的app_getcurrtime()替换,问题解决。

ESP32移植wolfssl方法

上一篇

启迈斯Q7L 跑步机破解

下一篇
评论
发表评论 说点什么
还没有评论
2168
0

    浙公网安备 33011002014706号