溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Linux中bug的解決方法

發(fā)布時(shí)間:2021-10-22 11:08:55 來(lái)源:億速云 閱讀:381 作者:柒染 欄目:互聯(lián)網(wǎng)科技

Linux中bug的解決方法,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

最近調(diào)試過(guò)程中遇到了一個(gè)問(wèn)題,現(xiàn)象是在沒(méi)有GPS信號(hào)的情況下,程序每次跑幾分鐘后就會(huì)出現(xiàn)以下錯(cuò)誤提示信息,導(dǎo)致程序中斷退出:

double free or corruption (out)

Aborted (core dumped)
此問(wèn)題折騰了我大概兩小時(shí),在此做個(gè)總結(jié)。
剛開(kāi)始我檢查代碼,是否有double free 的地方,發(fā)現(xiàn)并沒(méi)有。后來(lái),我在代碼里加了malloc是否成功的判斷以及free后指針賦NULL的語(yǔ)句,依然是同樣的問(wèn)題。
再后來(lái)我把log打開(kāi)看,看的過(guò)程中突然發(fā)現(xiàn)一個(gè)現(xiàn)象,就是每次程序掛掉時(shí),串口讀到的數(shù)據(jù)長(zhǎng)度都是450字節(jié),再仔細(xì)看,其實(shí)是讀了兩串?dāng)?shù)據(jù),即兩條GNRMC及其他語(yǔ)句。
buff len:450;$GNRMC,,V,,,,,,,,,,N*4D
$GNVTG,,,,,,,,,N*2E
$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
$GPGSV,1,1,00*79
$GLGSV,1,1,00*65
$GNGLL,,,,,,V,N*7A
$GNRMC,,V,,,,,,,,,,N*4D
$GNVTG,,,,,,,,,N*2E
$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
$GPGSV,1,1,00*79
$GLGSV,1,1,00*65
$GNGLL,,,,,,V,N*7A
double free or corruption (out)

Aborted (core dumped)

正常情況下,讀到都是如下信息,即只有一條GNRMC語(yǔ)句。

buff len:225;$GNRMC,,V,,,,,,,,,,N*4D
$GNVTG,,,,,,,,,N*2E
$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
$GPGSV,1,1,00*79
$GLGSV,1,1,00*65

$GNGLL,,,,,,V,N*7A

有了這個(gè)線索就好找問(wèn)題了,  問(wèn)題出在下面這個(gè)函數(shù)malloc分配空間時(shí)那個(gè)多加的數(shù)字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, ",,", ",@,");

   ……

這個(gè)100本意是用來(lái)將,,替換成,@,時(shí)用的,對(duì)于上面那種特殊狀態(tài),總共有114個(gè)連續(xù),,,所以空間分配不足,導(dǎo)致出現(xiàn)問(wèn)題。
解決方法也很簡(jiǎn)單,只要把100加大些就可以。  這個(gè)問(wèn)題,帶給我以下幾點(diǎn)啟發(fā):
1)malloc分配空間時(shí)大小一定要注意;
2)測(cè)試時(shí)要覆蓋各種可能的情況,不能只考慮正常狀態(tài),之前我就只測(cè)了有GPS信號(hào)時(shí)的狀態(tài);

3)測(cè)試時(shí)時(shí)間要足夠長(zhǎng)。

關(guān)于Linux中bug的解決方法問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI