有趣 | 最近遇到一個(gè)狡猾的bug,復(fù)盤分享
時(shí)間:2021-08-19 16:35:15
手機(jī)看文章
掃描二維碼
隨時(shí)隨地手機(jī)看文章
[導(dǎo)讀]關(guān)注「嵌入式大雜燴」,星標(biāo)公眾號(hào),一起進(jìn)步!最近遇到一個(gè)看似青銅、實(shí)則王者的bug。事情是這樣的,某個(gè)進(jìn)程有數(shù)據(jù)解析處理、算法融合。數(shù)據(jù)來(lái)源是gps模塊,我負(fù)責(zé)這個(gè)程序的開(kāi)發(fā)維護(hù)、與算法對(duì)接。下面看看從這個(gè)bug的定位、分析、解決過(guò)程,一波三折~機(jī)器之前一直正常在跑,但近兩天做了...
關(guān)注「嵌入式大雜燴」,星標(biāo)公眾號(hào),一起進(jìn)步!最近遇到一個(gè)看似青銅、實(shí)則王者的bug。
事情是這樣的,某個(gè)進(jìn)程有數(shù)據(jù)解析處理、算法融合。數(shù)據(jù)來(lái)源是gps模塊,我負(fù)責(zé)這個(gè)程序的開(kāi)發(fā)維護(hù)、與算法對(duì)接。下面看看從這個(gè)bug的定位、分析、解決過(guò)程,一波三折~機(jī)器之前一直正常在跑,但近兩天做了一些特殊測(cè)試,發(fā)現(xiàn)機(jī)器走到某個(gè)位置之后基本上必會(huì)出現(xiàn)段錯(cuò)誤,因?yàn)榕c位置相關(guān)的就是數(shù)據(jù)了,所以剛開(kāi)始的時(shí)候我懷疑可能是數(shù)據(jù)解析出問(wèn)題了。但是之前解析有長(zhǎng)時(shí)間測(cè)試過(guò),沒(méi)什么問(wèn)題,特殊位置也有測(cè)過(guò)沒(méi)什么問(wèn)題。暫時(shí)排除了數(shù)據(jù)解析的問(wèn)題。
事情是這樣的,某個(gè)進(jìn)程有數(shù)據(jù)解析處理、算法融合。數(shù)據(jù)來(lái)源是gps模塊,我負(fù)責(zé)這個(gè)程序的開(kāi)發(fā)維護(hù)、與算法對(duì)接。下面看看從這個(gè)bug的定位、分析、解決過(guò)程,一波三折~機(jī)器之前一直正常在跑,但近兩天做了一些特殊測(cè)試,發(fā)現(xiàn)機(jī)器走到某個(gè)位置之后基本上必會(huì)出現(xiàn)段錯(cuò)誤,因?yàn)榕c位置相關(guān)的就是數(shù)據(jù)了,所以剛開(kāi)始的時(shí)候我懷疑可能是數(shù)據(jù)解析出問(wèn)題了。但是之前解析有長(zhǎng)時(shí)間測(cè)試過(guò),沒(méi)什么問(wèn)題,特殊位置也有測(cè)過(guò)沒(méi)什么問(wèn)題。暫時(shí)排除了數(shù)據(jù)解析的問(wèn)題。
定位問(wèn)題
遇到死機(jī)問(wèn)題,當(dāng)然得先定位問(wèn)題,才能去分析、解決問(wèn)題。定位段錯(cuò)誤的方法有很多:1、log打印定位
可以把所有打印調(diào)試信息打開(kāi),一些段錯(cuò)誤問(wèn)題可以通過(guò)打印的方法就可以大致定位到某一塊代碼出現(xiàn)問(wèn)題。打印方式只是定位段錯(cuò)誤的一個(gè)小嘗試而已,不要對(duì)其結(jié)果抱有太大希望。有時(shí)候確實(shí)可以很快就定位到問(wèn)題的根源,但針對(duì)本次的bug,通過(guò)打印的方式定位出的結(jié)果反而給我們帶來(lái)了一些迷惑。本次的bug通過(guò)打印的方式也鎖定到了出問(wèn)題的代碼,在某個(gè)算法函數(shù)里的某兩個(gè)個(gè)三角函數(shù)的算式。問(wèn)題就是屏蔽掉這個(gè)算式,程序就沒(méi)出現(xiàn)段錯(cuò)誤,打開(kāi)這兩句代碼就必出現(xiàn)段錯(cuò)誤,這讓我的注意力集中在了這個(gè)地方。但反反復(fù)復(fù)看了好多次沒(méi)發(fā)現(xiàn)這兩個(gè)算式有什么不妥的地方,而且看了前后兩層函數(shù),也沒(méi)發(fā)現(xiàn)有什么不妥。最后定位出了問(wèn)題,這里確實(shí)不是問(wèn)題的根源,但卻在這浪費(fèi)了很多時(shí)間。應(yīng)該有很多小伙伴跟我有同樣的習(xí)慣,喜歡通過(guò)打印法來(lái)查找bug,打印法基本能定位到大多數(shù)問(wèn)題。但對(duì)于一些藏得很深的bug,通過(guò)打印法有時(shí)候只看到了表象,而我們有時(shí)候會(huì)被這表象給迷惑了。所以在分析問(wèn)題的時(shí)候,盡量頭腦清醒些,分析遇到不太合理的地方,要不斷的推敲,不斷地推翻不合理地分析。當(dāng)然,有好的定位問(wèn)題的方法也很重要,下面看第二種定位段錯(cuò)誤的方法:2、遠(yuǎn)程調(diào)試
遠(yuǎn)程GDB是一種適合嵌入式系統(tǒng)的調(diào)試手段。它使用目標(biāo)機(jī)端的gdbserver和主機(jī)端的gdb調(diào)試器協(xié)同進(jìn)行調(diào)試,再搭配vscode可以很方便地進(jìn)行調(diào)試。vscode gdb gdbserver遠(yuǎn)程調(diào)試的教程見(jiàn):干貨 | 遠(yuǎn)程gdb調(diào)試?遠(yuǎn)程GDB的原理是:?有一小段駐留在目標(biāo)機(jī)上的代碼,它被稱為調(diào)試樁,也稱為調(diào)試代理。調(diào)試代理負(fù)責(zé)目標(biāo)機(jī)上實(shí)現(xiàn)由主機(jī)上的調(diào)試器發(fā)送過(guò)來(lái)的調(diào)試命令,例如:讀寫(xiě)內(nèi)存、讀寫(xiě)寄存器、設(shè)置斷點(diǎn)及運(yùn)行被調(diào)試程序等。調(diào)試代理還要向主機(jī)調(diào)試器報(bào)告目標(biāo)機(jī)上的異常事件。?啟動(dòng)遠(yuǎn)程調(diào)試,全速運(yùn)行,當(dāng)程序出現(xiàn)段錯(cuò)誤時(shí)可以很快知道出現(xiàn)段錯(cuò)誤的代碼行號(hào)。本次的這個(gè)bug也是使用這種方法來(lái)快速定位出來(lái)的。除此之外還有其它很多方法來(lái)定位段錯(cuò)誤,如使用strace工具跟蹤、gdb調(diào)試core文件等方法,后續(xù)有機(jī)會(huì)再寫(xiě)使用分享。
分析、解決問(wèn)題
通過(guò)遠(yuǎn)程調(diào)試的方法可以快速定位到本次的段錯(cuò)誤出現(xiàn)在一個(gè)串口讀函數(shù)里的下面這一句代碼:FD_SET(fd,