1、背景
在嵌入式开发中,我们经常遇到的一个问题是:写代码一个不小心,就制造了一个bug,C语言中bug的威力大家也心知肚明——可以直接把系统搞挂!
即大家常见的系统死机、系统重启等等;而问题的来源或者根因,又常常使得我们束手无策,只好采用“打印”大法,一遍遍的加printf。
而每次改代码又要经历痛苦的“编译-烧写-运行-复现”这个过程,不知不觉,一天过去了,bug还没解。
所以我们经常想,要是系统能直接告诉我们bug在哪、是什么错误导致的就好了,直接改代码分分钟搞定,可以节省很多开发时间!
这也是我们常用一些仿真器(如JLINK)的原因,系统挂死后可以挂上仿真器,查看PC在哪,通过bt查看调用栈等来帮助我们定位。
而这又对硬件有了一定的要求——要能支持仿真器连接,有时还要开发者折腾一下环境。
我们的HaaS100虽然也支持硬件连接仿真器(参考上一篇帖子:HaaS100开发调试系列 之 如何使用J-Link仿真器调试代码)。
这里我们告知大家一个更方便定位系统异常死机的方法——AliOS Things的诊断调试组件。
2、诊断调试组件简介
诊断调试包含的内容很多,前面我们介绍过一些调试命令,参见文章《一文轻松入门HaaS100诊断调试系统》。
本文我们重点介绍的是AliOS Things的诊断调试组件是怎么帮助解决代码bug的。
诊断调试组件可以缩短bug定位时间。
如果一个bug出现导致系统异常后,用户可以不用连仿真器、不用加打印、不用打开gdb单步调试的情况下,可以快速找到bug原因。
或者帮助用户指出可能的异常点,进而修复以节省开发时间。
举例说明:
- 代码中访问了非法内存(比如:在不可写的地址处写了数据,如访问了0地址)导致系统奔溃,AliOS Things诊断调试组件可以记录访问非法内存时的pc值,告诉用户挂在了哪一行;
- 代码跑飞了(pc=0),AliOS Things诊断调试组件记录了函数调用的栈,并根据栈向上回溯可以找到A->B->C的函数调用过程,与仿真器中bt命令类似;
- 用户内存申请时malloc 失败,AliOS Things诊断调试组件可以记录用户此时申请了多少内存、此时系统还有多少内存可以供申请、用户是在哪个任务中申请的内存、从系统启动开始内存的申请情况等信息,这些信息可以帮助开发者定位是否有内存泄漏的情况。
- ......
AliOS Things的诊断调试组件可以干很多事,后面我们会陆续推出文章来介绍。
今天我们只看一个问题——bug产生了,系统异常挂死了,那么AliOS Things会做哪些事呢?
简单一句话回答,输出重要的log帮助大家定位问题,这也是AliOS Things的诊断调试组件最重要的部分。