1. 前言
2. 常用斷點(diǎn)存在的問題
3. IAR支持的斷點(diǎn)類型和使用方法
3.1. 代碼斷點(diǎn)
3.2 條件代碼斷點(diǎn)
3.3 讀寫訪問的數(shù)據(jù)斷點(diǎn)
3.4 數(shù)據(jù)日志斷點(diǎn)
3.5 日志斷點(diǎn)
3.6 電源斷點(diǎn)
4. 總結(jié):
5. 經(jīng)驗(yàn)交流:
1. 前言在產(chǎn)品開發(fā)中,調(diào)試工具是不可或缺的開發(fā)利器,除了日常常見的ARM的CMSIS-DAP/ULINK,IAR的I-JET,P&E的U-multilink/Cyclone, 各個(gè)半導(dǎo)體廠商自定義的XX-LINK(例如LPC-link, ST-Link,等)之外,還有兩個(gè)是神一樣的存在,一個(gè)是SEGGER的J-LINK,支持與IAR/KEIL等各種編譯環(huán)境無縫銜接,性能穩(wěn)如老狗, 價(jià)格低廉, 所以在嵌入式工程師中的普及率非常高,被稱為居家旅行匱贈(zèng)好友之佳品。另外一個(gè)是一聽名字就感覺高大上的勞特巴赫Lauterbach,作為專業(yè)第三方調(diào)試工具廠商,以其強(qiáng)大的TRACE32開發(fā)調(diào)試工具享譽(yù)全球,TRACE32開發(fā)工具擁有非常豐富和強(qiáng)大的功能,包括基本調(diào)試配置、RTOS、多核系統(tǒng)、虛擬目標(biāo)調(diào)試、能耗分析以及強(qiáng)大的腳本語言等,而且可以支持市場中使用的80多種常見的微處理架構(gòu)。
當(dāng)然Lauterbach性能的強(qiáng)大,對應(yīng)的代價(jià)就是價(jià)格也比JLINK多出一個(gè)數(shù)量級,但是對于大部分嵌入式開發(fā)者來說,最常用的還是基本的調(diào)試功能,包括斷點(diǎn),寄存器查看,內(nèi)存/Flash的查看,本文從斷點(diǎn)使用的角度講解如何使用JLINK配合IAR支持的各種斷點(diǎn)用出點(diǎn)勞德巴赫的一些強(qiáng)大功能。
2. 常用斷點(diǎn)存在的問題斷點(diǎn)的概念非常簡單,目的簡單來說就是在指定指令或者代碼行中斷程序的執(zhí)行,實(shí)現(xiàn)上可以是硬件斷點(diǎn)(通過編程FPB實(shí)現(xiàn))也可以是軟件斷點(diǎn)(通過插入BKPT斷點(diǎn)指令實(shí)現(xiàn) ),具體二者的底層實(shí)現(xiàn)這里不展開討論。常規(guī)的斷點(diǎn)調(diào)試(本質(zhì)上是代碼斷點(diǎn))是在想觀察哪里的問題時(shí)就在對應(yīng)的代碼地址雙擊設(shè)置斷點(diǎn),并且一旦運(yùn)行到斷點(diǎn)位置會讓程序自動(dòng)暫停運(yùn)行,然后觀察感興趣的變量,內(nèi)存或者寄存器,這種斷點(diǎn)調(diào)試功能能幫助開發(fā)者解決大部分的問題,但是其也有很大的局限性。
因?yàn)楹芏鄷r(shí)候我們只想知道某段代碼是否運(yùn)行過,而不能讓程序停下來,譬如說調(diào)試BLE協(xié)議棧,無法去單步運(yùn)行,否則會打斷BLE主機(jī)和從機(jī)之間的通訊時(shí)序,而導(dǎo)致整個(gè)系統(tǒng)功能出現(xiàn)問題。還有中斷處理函數(shù)的調(diào)試,程序一旦停下了也就失去了其他所有中斷的后續(xù)響應(yīng),再比如兩個(gè)設(shè)備通信,一旦一方采用常規(guī)斷點(diǎn)的方式調(diào)試,可能會打斷正常的通信過程。所以通常的做法是添加串口打印或者ITM半主機(jī)打印輸出log信息到顯示屏,但是這種方式會帶來額外的軟硬件開銷(對于串口打印來說是兩個(gè)UART pin腳+UART驅(qū)動(dòng)函數(shù),對于ITM打印輸出是一個(gè)SWO+ITM驅(qū)動(dòng)),甚至因?yàn)橐胄碌拇a導(dǎo)致程序出錯(cuò)。除此之外,還有3種場景是這種普通斷點(diǎn)無法滿足的,第一個(gè)是同一段循環(huán)體運(yùn)行N次才停下來,第二個(gè)是當(dāng)變量被寫入新的數(shù)據(jù)或者被讀取時(shí)停下來,第三個(gè)是實(shí)時(shí)記錄斷點(diǎn)所在行某個(gè)特定變量或者地址的值,并在時(shí)間軸上以圖形的形式顯示出來,方便分析和對比。
以上這些功能在這些功能在勞德巴赫中是最基本功能,同樣在IAR中也提供了不同形式的斷點(diǎn)類型和組合,只是日常習(xí)慣了只用了其代碼斷點(diǎn)的功能,沒能充分發(fā)揮IAR的強(qiáng)大斷點(diǎn)功能,針對以上4種問題在IAR中可以分別用日志斷點(diǎn)、條件斷點(diǎn)、讀寫權(quán)限的數(shù)據(jù)斷點(diǎn)、數(shù)據(jù)日志斷點(diǎn)逐個(gè)擊破,從而避免了額外添加代碼的繁瑣,也能為解決隱藏bug提供更加靈活的手段。尤其是其中的讀寫權(quán)限的數(shù)據(jù)斷點(diǎn),筆者曾經(jīng)就是使用這種辦法幫客戶解決了兩個(gè)埋藏的很深大bug,其中一個(gè)是查找某個(gè)關(guān)鍵變量在哪里被意外修改,通過設(shè)置條件斷點(diǎn)+stack callback迅速定位到了肇事代碼段,另一種是客戶代碼意外堆棧溢出調(diào)查,當(dāng)時(shí)的做法是在堆棧大小的90%地址靠近棧頂處設(shè)置一個(gè)寫觸發(fā)的數(shù)據(jù)斷點(diǎn),當(dāng)某層調(diào)用過程中堆棧接近溢出時(shí),設(shè)置的數(shù)據(jù)斷點(diǎn)會被觸發(fā)而停止應(yīng)用程序,從而迅速找到堆棧是在哪層調(diào)用溢出的,從而解決問題。
3. IAR支持的斷點(diǎn)類型和使用方法總結(jié)下來,在 IAR 中,主要有以下幾種斷點(diǎn),下面逐一介紹。
代碼斷點(diǎn)
條件斷點(diǎn)
讀寫訪問權(quán)限的數(shù)據(jù)斷點(diǎn)
數(shù)據(jù)日志斷點(diǎn)
日志斷點(diǎn)
電源斷點(diǎn)
3.1. 代碼斷點(diǎn)
這種斷點(diǎn)就是前面提到的最常用的斷點(diǎn),也是最簡單的斷點(diǎn)。開發(fā)則只需要在反匯編窗口中選擇C行或ASM指令并切換斷點(diǎn)。一旦遇到斷點(diǎn),用戶應(yīng)用程序?qū)⑼V埂_@時(shí)候可以查看變量、標(biāo)志和寄存器的值。換句話說,開發(fā)者擁有完全的控制權(quán)。對于這種普通代碼斷點(diǎn),其數(shù)量受限于硬件斷點(diǎn)的數(shù)量,例如對于 Arm Cortex-M,通常有6-8個(gè)硬件斷點(diǎn),但如果使用軟件斷點(diǎn)或在RAM中運(yùn)行應(yīng)用程序,則可以不受限制。使用時(shí)只需選擇顯示View -》 Breakpoints 窗口,就可以啟用或禁用斷點(diǎn)。
默認(rèn)情況下,IDE 將設(shè)置代碼斷點(diǎn),而且是auto類型,可以通過Option-》Debugger-》JLINK/JTrace-》Breakpoint去設(shè)置硬件斷點(diǎn)還是軟件斷點(diǎn)。如果開發(fā)者有 I-jet,可以在右鍵單擊代碼行時(shí)明確選擇一個(gè) flash斷點(diǎn)。注意斷點(diǎn)符號中的“F”。Flash 斷點(diǎn)功能在適用于 Arm 的IAR7.60 或更高版本中可用。
3.2 條件代碼斷點(diǎn)
條件斷點(diǎn)是代碼斷點(diǎn)與某些標(biāo)志或變量作為條件的組合。設(shè)置斷點(diǎn)后,同樣可以再次使用View -》 Breakpoints 窗口查看所有斷點(diǎn),也可以通過右鍵單擊并選擇Edit option來設(shè)置額外參數(shù)。
設(shè)置斷點(diǎn)條件所使用的語法類似于C語法,可以使用 ==、》= 和 《=。例如,如果您希望應(yīng)用程序在計(jì)數(shù)器等于 10 時(shí)在斷點(diǎn)處停止,您可以使用“counter==10”。這在中斷例程中需要斷點(diǎn)時(shí)非常有用。如果沒有設(shè)置條件,應(yīng)用程序就會一直被停止,影響到系統(tǒng)的正常工作,使用標(biāo)志或變量作為條件使事情變得容易得多。甚至用戶還可以使用跳過計(jì)數(shù)器和條件檢查(如true或changed)來實(shí)現(xiàn)更復(fù)雜的斷點(diǎn)停止條件設(shè)置。該方法可以解決上面提到的第二種問題。
3.3 讀寫訪問的數(shù)據(jù)斷點(diǎn)
與其他斷點(diǎn)相比,數(shù)據(jù)斷點(diǎn)有點(diǎn)不同,因?yàn)槭菍μ囟▋?nèi)存地址、標(biāo)志、變量或寄存器的讀寫訪問的監(jiān)控。使用時(shí)只需右鍵單擊標(biāo)志或變量并選擇選項(xiàng)Set data Breakpoint。默認(rèn)情況下,對該變量,特定地址,寄存器的任何讀取和寫入訪問都會觸發(fā)斷點(diǎn)。如果你想添加額外的設(shè)置,你可以通過View-》Breakpoints 窗口和Edit 選項(xiàng)來完成。 除了讀寫訪問之外,還可以監(jiān)控?cái)?shù)據(jù)是否匹配來作為斷點(diǎn)的觸發(fā)條件,這意味著寫或讀訪問只會在數(shù)據(jù)匹配時(shí)觸發(fā)暫停。另外,通過選擇編輯按鈕,開發(fā)者還可以打開一個(gè)額外的窗口,可以選擇絕對地址甚至源代碼所在行。對于變量或標(biāo)志,建議使用自動(dòng)大小。如果需要監(jiān)控更大的范圍,則應(yīng)手動(dòng)設(shè)置監(jiān)控的地址范圍或者變量范圍,譬如說監(jiān)控一個(gè)結(jié)構(gòu)體的數(shù)據(jù)變化,使用這種數(shù)據(jù)斷點(diǎn)也是可以實(shí)現(xiàn)的,但需要用戶正確設(shè)置變量,特定地址,寄存器等監(jiān)控對象的Size。使用這種方法可以解決前文提到的第三種問題。
此處需要特別提一下,數(shù)據(jù)斷點(diǎn)對于調(diào)試被應(yīng)用程序破壞的標(biāo)志和變量非常有用。筆者曾經(jīng)就是使用這種辦法在客戶解決了兩個(gè)埋藏的很深大bug,其中一個(gè)是查找某個(gè)關(guān)鍵變量在哪里被意外修改,通過設(shè)置條件斷點(diǎn)+stack callback迅速定位到了肇事代碼段,另一種是客戶端的意外堆棧溢出調(diào)查,當(dāng)時(shí)的做法是在堆棧大小的90%地址靠近棧頂處設(shè)置一個(gè)數(shù)據(jù)斷點(diǎn),當(dāng)堆棧溢出接近時(shí),設(shè)置的數(shù)據(jù)斷點(diǎn)會被觸發(fā)而停止應(yīng)用程序,從而迅速找到問題的根源,至于如何設(shè)置,此處暫不展開。
3.4 數(shù)據(jù)日志斷點(diǎn)
除了具有讀寫訪問權(quán)限的數(shù)據(jù)斷點(diǎn)外,開發(fā)者還可以使用數(shù)據(jù)日志斷點(diǎn)。這種斷點(diǎn)的好處在于可以在時(shí)間線中監(jiān)視和以圖形方式繪制內(nèi)存中特定變量或地址的值,使顯示更加直觀,用戶還可以在同一個(gè)時(shí)間軸上顯示和比較兩個(gè)或多個(gè)變量,從而在邏輯上排查問題。設(shè)置的方法就是View-》Breakpoints 窗口和Edit 選項(xiàng),然后選擇set Data Log Breakpoint for counter即可,使用這種方法可以解決前文提到的第四種問題。
時(shí)間線以及附加數(shù)據(jù)日志和數(shù)據(jù)日志摘要可在探針選項(xiàng)下找到,例如如下面的屏幕截圖所示。
3.5 日志斷點(diǎn)
除了代碼和數(shù)據(jù)斷點(diǎn)之外,還有一種日志斷點(diǎn),這是一個(gè)特殊的斷點(diǎn),因?yàn)樗粫R時(shí)暫時(shí)停止應(yīng)用程序以打印消息,然后繼續(xù)代碼的運(yùn)行。一旦運(yùn)行到設(shè)置的日志斷點(diǎn),它會顯示如下用戶預(yù)先設(shè)定的消息,告知用戶某個(gè)函數(shù)事件被觸發(fā)。這種方式的好處在于,無需額外添加串口打印或者ITM半主機(jī)打印輸出log信息到顯示屏,無需額外的軟硬件開銷,便可實(shí)現(xiàn)基本的信息打印,方便開發(fā)者跟蹤程序的執(zhí)行流程。
如下圖所示,每次斷點(diǎn)命中時(shí),調(diào)試日志窗口中都會顯示一條消息。添加的計(jì)數(shù)器可以了解應(yīng)用程序通過該部分源代碼的次數(shù)。通過這種辦法可以解決前面提到的第一個(gè)問題,即不停止代碼又能獲知感興趣的代碼段是否被執(zhí)行過,以及執(zhí)行的次數(shù),兵不血刃,無需添加任何額外的代碼。
3.6 電源斷點(diǎn)
除了代碼的調(diào)試,IAR還支持先進(jìn)的電源調(diào)試技術(shù),可以監(jiān)控功耗,并將其與源代碼相關(guān)聯(lián)。這也使得添加電源斷點(diǎn)成為可能,可以設(shè)置一個(gè)閾值,如 25mA,一旦能量高于該值,調(diào)試器將被觸發(fā)停止。設(shè)置閾值非常簡單, 只需要打開J-Link-》PowerLog 窗口,然后設(shè)置值和所需選項(xiàng),如上圖或下圖所示。通過這種分析,可以直觀的看出代碼執(zhí)行過程中的功耗值,下面的時(shí)間線窗口不是必需的,但它可以為提供正在使用的能量提供一個(gè)時(shí)間參考。
4. 總結(jié):至此,介紹完了IAR支持的6種不同的斷點(diǎn)類型和使用方法,也順帶針對性的解決了前文中提到的日常調(diào)試遇到的四個(gè)問題。如果在日常調(diào)試過程中靈活運(yùn)用以上的這幾種斷點(diǎn),對于日常調(diào)試提高開發(fā)速度和解決一些深藏的bug(例如前文提到的大型程序中變量被莫名修改,堆棧溢出追蹤等) 很有幫助。當(dāng)然勞特巴赫之所以賣的這么貴,必然有其強(qiáng)大之處,尤其是強(qiáng)大的腳本編程,多核系統(tǒng),能耗分析以及對芯片內(nèi)部操作的開放度,能給開發(fā)者最大的操作靈活度。但就日常的斷點(diǎn)調(diào)試看,IAR+JLINK的組合也基本能滿足大部分的需求,畢竟就地取材最方便。
責(zé)任編輯:haq
-
ARM
+關(guān)注
關(guān)注
135文章
9552瀏覽量
391855 -
調(diào)試
+關(guān)注
關(guān)注
7文章
646瀏覽量
35652
原文標(biāo)題:JLINK配合IAR斷點(diǎn)功能,讓bug無處可藏
文章出處:【微信號:TopSemic,微信公眾號:TopSemic嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
對比分析電能質(zhì)量在線監(jiān)測裝置支持的斷點(diǎn)續(xù)傳文件傳輸協(xié)議的優(yōu)缺點(diǎn)
電能質(zhì)量在線監(jiān)測裝置支持斷點(diǎn)續(xù)傳的文件傳輸協(xié)議有哪些?
電能質(zhì)量在線監(jiān)測裝置支持哪些通信協(xié)議以實(shí)現(xiàn)斷點(diǎn)續(xù)傳?
電能質(zhì)量在線監(jiān)測裝置支持斷點(diǎn)續(xù)傳歷史數(shù)據(jù)嗎?
基于蜂鳥E203的硬件斷點(diǎn)功能添加
條碼掃碼設(shè)備的使用方法
在 Keil / IAR 開發(fā)環(huán)境下的 Debug 模式下,用戶是否可以在空閑 ru 期間立即添加新的斷點(diǎn)?
InModbus2 APP支持“斷點(diǎn)續(xù)傳”嗎,是如何工作的?
錫膏的儲存及使用方法詳解
IAR平臺現(xiàn)已提供對Zephyr RTOS的量產(chǎn)級支持
邊緣計(jì)算網(wǎng)關(guān)支持斷點(diǎn)續(xù)傳嗎
odf光纖配線架使用方法
IAR全面支持芯馳科技車規(guī)MCU芯片E3650
請問IAR是否支持LS1043A?
PXI-8433/4的規(guī)范使用方法分享
IAR支持的斷點(diǎn)類型和使用方法
評論