|
最近调试公司的代码,但由于代码量巨大不方便使用gdb直接调试,所以采取用日志来记录记录代码中关键地方的执行状态,例如空指针异常、返回值异常等。具体的操作就是实现类printf形式的格式化输出,将错误信息记录到日志文件中或者通过terminal输出。受这个的启发,突然想到,我们在学校进行代码调试的时候基本都是直接使用jlink这样的方式进行在线仿真,通过下断点查看变量、寄存器的值,基本都不会使用一些额外的调试方法。所以有些同学在接小项目做的时候就会遇到这样的情况,明明自己都调试通过了,但是东西给“客户”后出了问题却不知道问题出在哪。
解决上述问题的最好方法就是加日志,可以通过两种方式:
1.重定向printf函数,通过串口输出调试信息。然后使用printf("func:%s, line:%d, debug_information:",__func__, __LINE__)这样的方式将关键信息打印出来,func代表函数名,line为该printf在该源文件中的行数;
2.使用sprintf函数,将调试信息格式化输出到buffer中,再将buffer中的数据保存到存储介质中(flash,sd卡)。使用示例:sprintf( buffer,"func:%s, line:%d, debug_information:",__func__, __LINE__);
方法就是这样,没有什么技术含量,但是这种方法却能提高效率。第一方式适合于bug的出现有规律情况,可以进行bug的复现,在复现过程中直接看串口的打印信息定位问题;方法二适合于bug的出现没有规律可循,不好复现的情况,则可采取将日志文件记录到存储介质中(ps;单片机上面采用这个方式,难度有点大,若要存到sd卡中的话,移植过文件系统的都知道是什么情况)。
介绍完毕。没看懂的话,留言讨论 |
|