重工电子论坛

标题: 调试小技巧 [打印本页]

作者: 顾福源    时间: 2016-10-12 18:29
标题: 调试小技巧
最近调试公司的代码,但由于代码量巨大不方便使用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
软件仿真效果

111.png (58.5 KB, 下载次数: 1076)

111.png

作者: 李钢-15级    时间: 2016-10-12 19:00
666.顾老师
作者: 李钢-15级    时间: 2016-10-12 19:00
666.顾老师
作者: 李维强-15级    时间: 2016-10-12 23:02
可以可以  顾老师V587
作者: 李维强-15级    时间: 2016-10-12 23:59
__func__ 是啥子?两边加了下划线的是啥子意思?
__LINE__ 这个行数的信息是啷个获取的?
作者: 顾福源    时间: 2016-10-15 20:31
李维强-15级 发表于 2016-10-12 23:59
__func__ 是啥子?两边加了下划线的是啥子意思?
__LINE__ 这个行数的信息是啷个获取的?

系统提供的,__func__获取该printf所在函数的函数名,返回一个字符串;__line__获取该printf所在源文件中的行号,返回一个整型数据
作者: 程浥    时间: 2016-10-24 15:56
本帖最后由 程浥 于 2016-10-24 16:49 编辑

看顾老师打印的信息比较NB
作者: 张金权-11级电子    时间: 2016-10-25 10:41
printf输出简单方便




欢迎光临 重工电子论坛 (http://cqutlab.cn/) Powered by Discuz! X3.1