double free or corruption (out) 刚开始我检查代码,是否有double free 的地方,发现并没有。后来,我在代码里加了malloc是否成功的判断以及free后指针赋NULL的语句,依然是同样的问题。再后来我把log打开看,看的过程中突然发现一个现象,就是每次程序挂掉时,串口读到的数据长度都是450字节,再仔细看,其实是读了两串数据,即两条GNRMC及其他语句。buff len:450;$GNRMC,,V,,,,,,,,,,N*4D$GNGGA,,,,,,0,00,99.99,,,,,,*56$GNGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*2E$GNGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*2E$GNRMC,,V,,,,,,,,,,N*4D$GNGGA,,,,,,0,00,99.99,,,,,,*56$GNGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*2E$GNGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*2Edouble free or corruption (out)Aborted (core dumped) 正常情况下,读到都是如下信息,即只有一条GNRMC语句。 buff len:225;$GNRMC,,V,,,,,,,,,,N*4D$GNGGA,,,,,,0,00,99.99,,,,,,*56$GNGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*2E$GNGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*2E$GNGLL,,,,,,V,N*7A 有了这个线索就好找问题了,问题出在下面这个函数malloc分配空间时那个多加的数字100上,int gps_analyse(char *buff,int buff_len,GNSS *gps_data) { …… char *tmpbuf; tmpbuf = (char *)malloc(strlen(ptr)+100); memset(tmpbuf, 0, strlen(ptr)+100); memcpy(tmpbuf, ptr, strlen(ptr)); while (strstr(tmpbuf, ",,")) strrpl(tmpbuf, ",,", ",@,"); …… 这个100本意是用来将,,替换成,@,时用的,对于上面那种特殊状态,总共有114个连续,,,所以空间分配不足,导致出现问题。解决方法也很简单,只要把100加大些就可以。这个问题,带给我以下几点启发:2)测试时要覆盖各种可能的情况,不能只考虑正常状态,之前我就只测了有GPS信号时的状态;3)测试时时间要足够长。 最后再留一个问题给大家思考,为什么每隔几分钟会一下读到两条GNRMC语句呢?大家可以评论区留言。如果你觉得本公众号不错,欢迎推荐给身边的朋友,让我们一起成长!
|