我們常常說(shuō),軟件三分寫(xiě)七分調(diào)。實(shí)際開(kāi)發(fā)中,確實(shí)也是這樣子的。我工作這幾年了,對(duì)這體會(huì)也越來(lái)越深。每當(dāng)需求一下來(lái),我代碼很快就可以寫(xiě)完,但是,調(diào)試需要花很多時(shí)間。
這里需要明確的是, 調(diào)試的目的不僅僅是調(diào)通整個(gè)功能需求
。調(diào)通功能是最基本的要求,還需要進(jìn)行優(yōu)化、完善邏輯、完善異常處理。所以,需要非常長(zhǎng)的時(shí)間。
記得畢業(yè)的時(shí)候參與的第一個(gè)項(xiàng)目,那個(gè)項(xiàng)目的硬件架構(gòu)相對(duì)一般產(chǎn)品來(lái)說(shuō)會(huì)復(fù)雜一些:

我負(fù)責(zé)的部分就是D芯片的軟件。D芯片所做的事情就是跟產(chǎn)品功能比較相近的,當(dāng)時(shí)通過(guò)A發(fā)數(shù)據(jù),經(jīng)過(guò)B、C之后,再到D,產(chǎn)品功能表現(xiàn)得不正常。我當(dāng)時(shí)的 第一反應(yīng)
就是我負(fù)責(zé)得D芯片的邏輯可能出問(wèn)題了。
A、B、C都是比較有經(jīng)驗(yàn)的工程師負(fù)責(zé)的,而且負(fù)責(zé)C的還是個(gè)組長(zhǎng)級(jí)別的,大家也覺(jué)得應(yīng)該是我負(fù)責(zé)的D芯片的代碼出的問(wèn)題,因?yàn)槲沂莻€(gè)剛畢業(yè)的新人,覺(jué)得問(wèn)題出在我這里的概率比較大。
他們也沒(méi)有去查是不是他們的問(wèn)題,每天就是來(lái)看看我是否有找到問(wèn)題?;藥滋斓臅r(shí)間,我最后才定位出來(lái),是C芯片給我發(fā)的數(shù)據(jù)出問(wèn)題了~
因?yàn)楫?dāng)時(shí)缺乏調(diào)試經(jīng)驗(yàn),所以沒(méi)能很快就定位出問(wèn)題所在。要是現(xiàn)在的話(huà),這種問(wèn)題很快就能查出來(lái)的。因?yàn)楝F(xiàn)在積累了一些經(jīng)驗(yàn):
調(diào)試經(jīng)驗(yàn)
平時(shí)開(kāi)發(fā)調(diào)試時(shí),可能會(huì)有這么兩種情況:
-
獨(dú)立開(kāi)發(fā),自己調(diào)試
-
協(xié)作開(kāi)發(fā),聯(lián)合調(diào)試
1、獨(dú)立開(kāi)發(fā)
一些小的項(xiàng)目,如果整個(gè)項(xiàng)目是我們自己開(kāi)發(fā)的話(huà),調(diào)試起來(lái)也比較方便,因?yàn)槭俏覀冏约洪_(kāi)發(fā)的,所以會(huì)比較熟悉一些。
我的習(xí)慣是:分模塊來(lái)進(jìn)行開(kāi)發(fā),每開(kāi)發(fā)完一個(gè)模塊就先想辦法測(cè)一下這個(gè)模塊,沒(méi)問(wèn)題了再集成到工程里。模塊初步開(kāi)發(fā)、測(cè)試時(shí),代碼可以隨意一些,調(diào)好了之后,再重新梳理、整理代碼,集成到工程里。
自測(cè)的方式:有一些代碼直接對(duì)應(yīng)著功能,直接測(cè)試看功能正不正常;有一些代碼可以通過(guò)log打印來(lái)看是否正常;有一些可能需要在線(xiàn)調(diào)試看看是否符合預(yù)期;有一些需要數(shù)據(jù)輸入的,可以自己模擬一些數(shù)據(jù)等。
2、協(xié)同開(kāi)發(fā)
協(xié)同開(kāi)發(fā)時(shí),可能就比較麻煩一些。特別的,有時(shí)候甚至需要跨部門(mén)對(duì)接調(diào)試。
我的習(xí)慣是:先開(kāi)發(fā)并自測(cè)自己的模塊;然后模擬對(duì)方,簡(jiǎn)單地自測(cè)通信。
自測(cè)自己模塊的方式如上面獨(dú)立開(kāi)發(fā)一樣。我們模擬對(duì)方進(jìn)行測(cè)試時(shí),需要考慮是不是需要花比較多的時(shí)間,如果需要花太多的時(shí)間的花就算了,等到聯(lián)調(diào)再一起調(diào)。
花時(shí)間較少的,可以自測(cè)通信的情況可能有如下三種:
- 線(xiàn)程/進(jìn)程間通信。這應(yīng)該比較容易,模擬對(duì)方線(xiàn)程/進(jìn)程進(jìn)行收發(fā)測(cè)試。可以寫(xiě)一些測(cè)試命令,比如發(fā)某個(gè)命令,觸發(fā)某條消息發(fā)送。
- 板間通信,如串口通信??梢杂么谥帜M對(duì)方進(jìn)行測(cè)試,自己對(duì)照協(xié)議模擬一些協(xié)議數(shù)據(jù)進(jìn)行收發(fā)測(cè)試。
- socket通信,如TCP通信。你負(fù)責(zé)客戶(hù)端,就模擬服務(wù)端;你負(fù)責(zé)服務(wù)端,就模擬客戶(hù)端。
當(dāng)然,協(xié)作開(kāi)發(fā)也可以不自測(cè)通信,看個(gè)人習(xí)慣。
我模擬自測(cè)通信是為了對(duì)我自己的模塊的通信有一定的把控,聯(lián)調(diào)時(shí)出問(wèn)題時(shí),就可以比較快地指出對(duì)方的問(wèn)題。當(dāng)然,這不是為了推鍋,而是為了能更好地分析、解決聯(lián)調(diào)問(wèn)題。
比如,我最近的項(xiàng)目中,設(shè)備與手機(jī)APP對(duì)接。配網(wǎng)功能、設(shè)備于A(yíng)PP局域網(wǎng)內(nèi)通信功能。我負(fù)責(zé)設(shè)備端,設(shè)備端作為服務(wù)器;對(duì)方作為客戶(hù)端。
在與對(duì)方聯(lián)調(diào)前,我已經(jīng)寫(xiě)了一個(gè)客戶(hù)端運(yùn)行于PC或設(shè)備上,模擬對(duì)方的手機(jī)APP,對(duì)我的模塊做了基本的自測(cè),也測(cè)出了我的模塊的一些問(wèn)題。
然后在與對(duì)方正式聯(lián)調(diào)時(shí),出現(xiàn)的大多問(wèn)題都在對(duì)方那邊,所以這時(shí)候我就可以幫助對(duì)方分析問(wèn)題,提高了聯(lián)調(diào)效率。
上面分享了一些我的經(jīng)驗(yàn)及思路,下面看看一些具體的調(diào)試方法與調(diào)試工具:
調(diào)試方法
1、LOG
我在實(shí)際工作中,log打印調(diào)試解決了我大多數(shù)的問(wèn)題,一般的問(wèn)題,通過(guò)分析log都可以定位出問(wèn)題所在。但是,打log也是有很多講究的,需要我們打印出有助于我們調(diào)試的信息。
比如:
- log的格式
帶時(shí)間戳、函數(shù)名、行號(hào)等有助于分析問(wèn)題的信息。比如:
[func:100]
當(dāng)然,實(shí)際中可能不只包含如上信息,根據(jù)需要添加。
- 在一些判斷分支要加上log
這樣可以清楚地知道程序跑到分支判斷時(shí)的執(zhí)行流程。
- 在一些大的操作的開(kāi)始處,加上顯眼的log
可以清楚地知道某個(gè)操作開(kāi)始的地方。
- 業(yè)務(wù)邏輯模塊,可以加上特定的標(biāo)簽
比如統(tǒng)一的log的格式中加上特定標(biāo)簽,比如BUSINESS。如:
[BUSINESS][func:100]
因?yàn)闃I(yè)務(wù)邏輯一般是整個(gè)項(xiàng)目地最上層,其它模塊都是為它服務(wù)的。
我們看log的時(shí)候,通過(guò)編輯器搜索關(guān)鍵字 BUSINESS
就可以只列出業(yè)務(wù)邏輯相關(guān)的log,我們只要看這些log,就可以大致知道程序的運(yùn)行流程。
當(dāng)然,其它模塊也可以根據(jù)需要加上標(biāo)簽。
- 控制log打印頻率
與數(shù)據(jù)打交道的模塊可能需要打印一些數(shù)據(jù)來(lái)分析源數(shù)據(jù)是否正常。可以稍微的控制打印頻率,盡可能在不影響數(shù)據(jù)分析的情況下打印盡可能少的log。
否則,一些log的文件動(dòng)不動(dòng)就幾百M(fèi)B,分析起來(lái)也很頭疼。特別的,log需要保存在flash上時(shí),為了防止log爆滿(mǎn)flash,常常需要限制log文件的大小并做log滾動(dòng)覆蓋,這時(shí)候無(wú)效log太多了可能就會(huì)覆蓋掉有效的log。
往期關(guān)于log調(diào)試相關(guān)的文章:
C語(yǔ)言、嵌入式中幾個(gè)非常實(shí)用的宏技巧
bug解決不了?使用日志法
分享一個(gè)極簡(jiǎn)的log模塊!
嵌入式軟件打log的一些心得!
2、在線(xiàn)調(diào)試
在線(xiàn)調(diào)試,可以看到程序運(yùn)行的更多細(xì)節(jié)?;镜膽?yīng)該都會(huì)吧。
GDB往期相關(guān)推文:
例說(shuō)GDB調(diào)試
手把手教你使用VSCode + gdb + gdbserver調(diào)試ARM程序
GDB調(diào)試器的簡(jiǎn)單使用(圖文)
關(guān)于keil的調(diào)試相關(guān)的內(nèi)容,推薦看一下我同事魚(yú)鷹寫(xiě)的文章(公眾號(hào):魚(yú)鷹談單片機(jī)),他對(duì)這方面研究得比較深。
3、其它調(diào)試工具
我們公眾號(hào)之前也分享了很多有用的調(diào)試相關(guān)的工具:
(1)VirtLCD
這是一個(gè)實(shí)用的LCD模擬器,手頭上暫時(shí)沒(méi)有LCD或者開(kāi)發(fā)初期,需要頻繁下載程序,驗(yàn)證效果的時(shí)候,可以使用VirtLCD來(lái)提高我們的開(kāi)發(fā)、調(diào)試效率。
VirtLCD的介紹及簡(jiǎn)單使用:
實(shí)用 | 手頭上無(wú)LCD卻又急著開(kāi)發(fā)UI?LCD模擬器了解一下~
(2)Wireshark
Wireshark 是一個(gè)網(wǎng)絡(luò)封包分析軟件。比如我們?cè)谡{(diào)試socket通信的時(shí)候,可以使用Wireshark 監(jiān)控看看我們有沒(méi)有發(fā)送數(shù)據(jù)出去,或者有沒(méi)有收到對(duì)方發(fā)送的數(shù)據(jù)。
wireshark的介紹及簡(jiǎn)單使用:
wireshark抓包工具的使用及分析
(3)VSPD
Virtual Serial Port Driver(VSPD)是一個(gè)虛擬串口軟件。虛擬串口軟件是一種模擬物理串行接口的軟件,它完全復(fù)制了硬件 COM 接口的功能,并且將被操作系統(tǒng)和串行應(yīng)用程序識(shí)別為真實(shí)端口。
在編寫(xiě)串口上位機(jī)時(shí),需要進(jìn)行調(diào)試。一種方式是與下位機(jī)進(jìn)行通信進(jìn)行測(cè)試;另一種方式是借助虛擬串口軟件來(lái)進(jìn)行測(cè)試。
VSPD的介紹及簡(jiǎn)單使用:
工具 | 虛擬串口軟件的使用分享
(4)LVGL GUI Guider
GUI Guider是恩智浦為L(zhǎng)VGL開(kāi)發(fā)了一個(gè)上位機(jī)GUI設(shè)計(jì)工具,可以通過(guò)拖放控件的方式設(shè)計(jì)LVGL GUI頁(yè)面,加速GUI的設(shè)計(jì)。
相關(guān)文章:
實(shí)用工具 | LVGL GUI-Guider的使用分享
基于vs2019的lvgl模擬器使用
lvgl最新版本在STM32上的移植使用
(5)Jlink+JScope
J-Scope
是 SEGGER 推出的波形顯示軟件,傻瓜式,簡(jiǎn)單易上手。需要搭配 Jlink仿真器
(V9或V10)使用。
J-Scope的介紹及簡(jiǎn)單使用:
J-Scope的介紹及簡(jiǎn)單使用
(6)SEGGER_RTT
RTT全稱(chēng)是Real Time Transmit(實(shí)時(shí)傳輸),是SEGGER 公司推出的,是搭配 Jlink仿真器
(V9或V10)使用的一種調(diào)試手段。
SEGGER_RTT的介紹及簡(jiǎn)單使用:
SEGGER_RTT的介紹及簡(jiǎn)單使用
(7)CmBacktrace
CmBacktrace (Cortex Microcontroller Backtrace)是一款針對(duì) ARM Cortex-M 系列 MCU 的錯(cuò)誤代碼自動(dòng)追蹤、定位,錯(cuò)誤原因自動(dòng)分析的開(kāi)源庫(kù)。
CmBacktrace 的介紹及簡(jiǎn)單使用:
CmBacktrace 的介紹及簡(jiǎn)單使用
(8)VOFA+
VOFA+(伏特加)插件驅(qū)動(dòng)的高自由度上位機(jī)。其是一款通用的數(shù)據(jù)調(diào)試工具,它讓圖形化調(diào)試變得像串口調(diào)試一樣簡(jiǎn)單。通過(guò)打印字符串,或者發(fā)送十六進(jìn)制數(shù)字的方式,就能完成數(shù)據(jù)的可視化操作。
官網(wǎng):
https://www.vofa.plus/
VOFA+的介紹及簡(jiǎn)單使用:
VOFA+的介紹及簡(jiǎn)單使用
(9)QEMU
QEMU是一款知名的而且開(kāi)源的模擬器(官網(wǎng):https://www.qemu.org/),它能在 X86 PC 上運(yùn)行能夠模擬 Arm、MIPS、RISC-V 等各種 CPU 和開(kāi)發(fā)板,以及 網(wǎng)卡、聲卡、鍵盤(pán)、sdcard、emmc、usb等各種外設(shè)。
QEMU我還未使用過(guò),之前轉(zhuǎn)載的一篇文章:
Linux利器:QEMU!用它模擬開(kāi)發(fā)板能替代真開(kāi)發(fā)板?
(10)Valgrind
Valgrind是一套Linux下,開(kāi)放源代碼(GPL V2)的仿真調(diào)試工具的集合。
Valgrind的介紹及簡(jiǎn)單使用:
工具 | Valgrind仿真調(diào)試工具的使用
(11)Bus hound
Bus hound是一款為了在pc電腦上進(jìn)行總線(xiàn)數(shù)據(jù)包監(jiān)控以及操控的開(kāi)發(fā)工具。用來(lái)捕捉來(lái)自設(shè)備的協(xié)議包和輸入輸出操作,它是功能強(qiáng)大的總線(xiàn)協(xié)議分析器。
之前有與USB上位機(jī)聯(lián)調(diào),通過(guò)這個(gè)工具可以監(jiān)控上位機(jī)發(fā)出的數(shù)據(jù)是否正確。關(guān)于Bus hound的文章我們公眾號(hào)還沒(méi)有分享過(guò),先占個(gè)坑,之后有機(jī)會(huì)再分享。
審核編輯 :李倩
-
芯片
+關(guān)注
關(guān)注
460文章
52520瀏覽量
441028 -
模塊
+關(guān)注
關(guān)注
7文章
2788瀏覽量
50404 -
嵌入式
+關(guān)注
關(guān)注
5152文章
19675瀏覽量
317638
原文標(biāo)題:分享嵌入式軟件調(diào)試方法和幾個(gè)工具
文章出處:【微信號(hào):strongerHuang,微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
調(diào)試工具:Eclipse調(diào)試工具欄與窗口的深入分析

嵌入式軟件開(kāi)發(fā)常用的軟件有哪些?
普源示波器MSO5074在嵌入式系統(tǒng)聯(lián)合調(diào)試中的高效實(shí)踐

如何成為一名嵌入式軟件工程師?
嵌入式軟件單元測(cè)試的必要性、核心方法及工具深度解析
嵌入式軟件測(cè)試技術(shù)深度研究報(bào)告
盤(pán)點(diǎn)工程師常用的嵌入式開(kāi)發(fā)工具
如何提高嵌入式代碼質(zhì)量?
嵌入式工程師常用的開(kāi)發(fā)工具有哪些?
嵌入式系統(tǒng)開(kāi)發(fā)與硬件的關(guān)系 嵌入式系統(tǒng)開(kāi)發(fā)常見(jiàn)問(wèn)題解決
嵌入式學(xué)習(xí)建議
EsDA,一站式嵌入式軟件

嵌入式開(kāi)發(fā)常用軟件有哪些?
嵌入式軟件開(kāi)發(fā)與AI整合

評(píng)論