www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 嵌入式大雜燴
[導(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)題。

定位問(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,
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
關(guān)閉
關(guān)閉