顾福源 发表于 2016-10-12 18:29:16

调试小技巧

最近调试公司的代码,但由于代码量巨大不方便使用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卡中的话,移植过文件系统的都知道是什么情况)。
介绍完毕。没看懂的话,留言讨论

顾福源 发表于 2016-10-12 18:31:48

软件仿真效果

李钢-15级 发表于 2016-10-12 19:00:13

666.顾老师

李钢-15级 发表于 2016-10-12 19:00:17

666.顾老师

李维强-15级 发表于 2016-10-12 23:02:13

可以可以顾老师V587

李维强-15级 发表于 2016-10-12 23:59:14

__func__ 是啥子?两边加了下划线的是啥子意思?
__LINE__ 这个行数的信息是啷个获取的?

顾福源 发表于 2016-10-15 20:31:39

李维强-15级 发表于 2016-10-12 23:59
__func__ 是啥子?两边加了下划线的是啥子意思?
__LINE__ 这个行数的信息是啷个获取的?

系统提供的,__func__获取该printf所在函数的函数名,返回一个字符串;__line__获取该printf所在源文件中的行号,返回一个整型数据

程浥 发表于 2016-10-24 15:56:00

本帖最后由 程浥 于 2016-10-24 16:49 编辑

看顾老师打印的信息比较NB

张金权-11级电子 发表于 2016-10-25 10:41:58

printf输出简单方便
页: [1]
查看完整版本: 调试小技巧