嵌入式开发常用的调试手段有哪几种?简述它们各自的优缺点?
1、LOG
我在实际工作中,log打印调试解决了我大多数的问题,一般的问题,通过分析log都可以定位出问题所在。
log的格式:
带时间戳、函数名、行号等有助于分析问题的信息。
<xxx ms>[func:100]
实际中可能不只包含如上信息,根据需要添加,在一些判断分支要加上log,这样可以清楚地知道程序跑到分支判断时的执行流程。在一些大的操作的开始处,加上显眼的log,可以清楚地知道某个操作开始的地方。业务逻辑模块,可以加上特定的标签。比如统一的log的格式中加上特定标签,比如BUSINESS。如:<xxx ms>[BUSINESS][func:100]
缺点:
我们看log的时候,通过编辑器搜索关键字 BUSINESS 就可以只列出业务逻辑相关的log,我们只要看这些log,就可以大致知道程序的运行流程。当然,其它模块也可以根据需要加上标签。与数据打交道的模块可能需要打印一些数据来分析源数据是否正常。可以稍微的控制打印频率,尽可能在不影响数据分析的情况下打印尽可能少的log。否则,一些log的文件动不动就几百MB,分析起来也很头疼。特别的,log需要保存在flash上时,为了防止log爆满flash,常常需要限制log文件的大小并做log滚动覆盖,这时候无效log太多了可能就会覆盖掉有效的log。
优点:可以打印输出出代码完整流程中数据的变化。不限制编译器种类,只要能输出,就可以打印log,很方便。
2、GDB调试
GDB 全称 "GNU symbolic debugger”,从名称上不难看出,它诞生于GNU计划(同时诞生 的还有GCC、Emacs等),是Linux下常用的程序调试器。发展至今,GDB已经迭代了诸多个版本,当下的GDB支持调试多种编程语言编写的程序,包括C、C++、Go、Objective—C、
OpenCL、Ada等。实际场景中,GDB更常用来调试C和C++程序。一般来说,GDB主要帮助我们完成以下四个方面的功能:
1.启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2.在某个指定的地方或条件下暂停程序。
3.当程序被停住时,可以检查此时你的程序中所发生的事。
4.在程序执行过程中修改程序中的变量或条件,将一个bug产生的影响修正从而测试其他bug。
使用GDB调试程序,有以下两点需要注意:
1.要使用GDB调试某个程序,该程序编译时必须加上编译选项—g,否则该程序是不包含调试信息的;
2.GCC编译器支持 —o和—g 一起参与编译。
缺点:
开销大,效率低。
优点:
资源占用小,速度快,多程序同步调不会产生冲突
3、JTAG 调试
基于JTAG(Joint test action group)的调试方法是ARM 系统调试的最常用方法,因为ARM 处理器中集成了JTAG 调试模块。调试主机上必须安装的工具包括程序编辑和编译系统、调试器和程序所涉及的库文件。目标板必须含有J ,I'AG 接口。在调试主机和目标板之间有一个协议转换模块,一般称为调试代理,其作用主要有两个:一个是在调试主机和目标板之间进行协议转换;另一个是进行接口转换,目标板的一端是标准的JTAG 接口,而调试主机一端可能是RS 一232 串口。也可能是并口或是USB 接口等。调试系统结构如图3 所示。JTAC 仿真器比较便宜,比较方便,通过现有的JTAG 边界扫描口与ARM 处理器核通信,属于完全非插入式(即不使用片上资源)调试,它不需要目标存储器的干预。也不占用目标板上的任何端口,而这些条件是驻留监控软件所必须的。另外。因为ⅡAG调试的程序是在目标板上执行的,仿真效果更接近于目标硬件,因此,对于一些高频的操作限制、接口操作问题、AC(交流)和DC(直流)参数不匹配。电线长度的限制等被最小化了。我们使用集成开发环境配合JTAG仿真器进行开发是目前最流行的一种调试方式.它的优点是方便、无需任何监控程序,软件硬件均可调试,可以重复利用JTAG 硬件测试接口,可以在RAM中设置断点外,还可以在ROM 中设置断点。
缺点:
仅适用于有调试接口的芯片。占用引脚数比较多,比较占用板子尺寸。
优点:
不限于ARM内核单片机,还能支持更多单片机程序调试和下载。用途更广,用于编程,调试和生产测试。