trace32 for rt-thread support
掃描二維碼
隨時(shí)隨地手機(jī)看文章
trace32 for rt-thread support
-
1.概述
-
2.trace32的基本使用
-
3.trace32系統(tǒng)插件原理
-
4.離線trace32得到rt-thread狀態(tài)信息
-
4.1 trace32上的rt-thread插件及菜單欄
-
4.2 trace32 加載dump以及elf文件
-
5.總結(jié)
1.概述
Lauterbach是全球最大的、完整的、模塊化和可升級(jí)微處理器開發(fā)工具的生產(chǎn)商,自1979年以來(lái),在制造世界一流的調(diào)試器和實(shí)時(shí)跟蹤方面擁有豐富經(jīng)驗(yàn)。其中產(chǎn)品線中的TRACE32為大眾廣為所知,是眾多手機(jī)廠商、芯片廠商的必備工具。
在嵌入式底層開發(fā)來(lái)說,不使用一下trace32,絕對(duì)想不到開發(fā)調(diào)試的便利及其功能的強(qiáng)大。
有幸在對(duì)某個(gè)芯片的支持上學(xué)習(xí)使用了trace32工具,并寫了一些trace32 for rt-thread的插件,現(xiàn)在梳理一下心得體會(huì)以及實(shí)現(xiàn)的相關(guān)細(xì)節(jié)。
2.trace32的基本使用
關(guān)于trace32的使用,Lauterbach已經(jīng)提供了相當(dāng)完善的文檔支持,對(duì)于芯片的架構(gòu)分析、軟件的重入分析、數(shù)據(jù)的觀測(cè)、操作系統(tǒng)的狀態(tài)以及各種符號(hào)信息等等都非常容易的觀察到。其調(diào)試功能的強(qiáng)大,非常的好用,但是由于其硬件設(shè)備的昂貴,能夠長(zhǎng)時(shí)間的使用trace32也是非常有難度的。
但是trace32也提供了相關(guān)的模擬版本,所以這里采用TRACE32 Simulator版本進(jìn)行演示離線功能。
可以直接選擇,也可輸入命令
首先選擇CPU的型號(hào)
可以直接選擇下面的提示框,也可以直接輸入sys.cpu進(jìn)行選擇,這里選擇Cortex-A9。
接著就可以輸入system.up,啟動(dòng)了。
導(dǎo)入elf符號(hào)
可以看到符號(hào)文件對(duì)應(yīng)的地址及其代碼。直接通過elf符號(hào)就能得到程序的源代碼。
此時(shí)只需要結(jié)合dump文件,結(jié)合elf符號(hào),則可以定位到當(dāng)前程序執(zhí)行的狀態(tài)。
從上述功能分析來(lái)看,主要是兩部分構(gòu)成:
1.菜單欄(menu bar)
2.顯示信息窗口
無(wú)論是點(diǎn)擊菜單欄還是在命令行輸入命令,達(dá)到的效果其實(shí)一樣。菜單欄只是一個(gè)簡(jiǎn)單的插件,系統(tǒng)可以調(diào)用命令。
3.trace32系統(tǒng)插件原理
trace32是一個(gè)工具,其提供了各種各樣的芯片及操作系統(tǒng)插件,同時(shí)也可以根據(jù)這些插件來(lái)展示需要的信息。
在操作系統(tǒng)層面,RTOS這部分,國(guó)外的許多操作系統(tǒng)都得到了很好的支持,例如Linux、freertos或者ucosii等等,所以我在此基礎(chǔ)上做了rt-thread的支持。
要想做其支持,首先需要得到Lauterbach的官方的支持,提供EDK,也需要對(duì)rt-thread系統(tǒng)底層有著非常深刻的理解,尤其對(duì)于系統(tǒng)的全局容器對(duì)象、線程、IPC的結(jié)構(gòu)體數(shù)組的布局都十分的清楚后,就可以進(jìn)行插件的擴(kuò)展開發(fā)了。
其底層原理可以概述如下:
TRACE32在進(jìn)行程序分析的時(shí)候,可以通過ELF獲取到符號(hào)表信息,可以查詢到系統(tǒng)的全局變量和函數(shù)地址信息的。當(dāng)程序在動(dòng)態(tài)運(yùn)行的時(shí)候,根據(jù)符號(hào)表對(duì)應(yīng)的地址讀取數(shù)據(jù),可以得到當(dāng)前程序的狀態(tài)信息。
而在rt-thread中,有個(gè)核心的全局靜態(tài)變量,對(duì)象容器(rt_object_container)。記錄著當(dāng)前系統(tǒng)中所有的線程、IPC等鏈表的掛載點(diǎn),而根據(jù)這個(gè)線索,又可以尋找到每個(gè)鏈表地址對(duì)應(yīng)的結(jié)構(gòu)體,根據(jù)符號(hào)信息從而找到對(duì)應(yīng)的對(duì)象的狀態(tài)結(jié)構(gòu)體的數(shù)據(jù)。
而TRACE32插件基本的原理也就是利用了符號(hào)以及地址的對(duì)應(yīng)關(guān)系,從而得到了系統(tǒng)的信息以及當(dāng)前的狀態(tài)。
4.離線trace32得到rt-thread狀態(tài)信息
在離線分析這部分,dump方案根據(jù)具體的硬件變化而變化,所以這里不多敘述,只采用qemu來(lái)dump在程序動(dòng)態(tài)運(yùn)行時(shí)的數(shù)據(jù)信息。
為了簡(jiǎn)單起見,這里采用樹莓派2b的rt-thread bsp來(lái)做演示。
raspi2在qemu上啟動(dòng),須在啟動(dòng)之前的匯編加上一句話。
/* Suspend the other cpu cores */
mrc p15, 0, r0, c0, c0, 5
ands r0, #3 bne _halt
其中_halt的實(shí)現(xiàn)如下:
_halt: wfe b _halt
此處掛起其他的核。
而后在env工具下輸入scons進(jìn)行編譯,并且輸入下面的命令測(cè)試qemu的執(zhí)行
qemu-system-arm -M raspi2 -m 1024M -serial null -serial stdio -kernel rtthread.elf
可以看到如下的效果:
接著進(jìn)入調(diào)試階段
qemu-system-arm -M raspi2 -m 1024M -serial null -serial stdio -kernel rtthread.elf -s -S
接著,另外開啟一個(gè)env終端。
依次輸入下面的命令,其中dump到的文件是
dump binary memory rtt_dump 0x8000 0x1000000
可以得到rtt_dump的dump的文件,大小為16MB。
4.1 trace32上的rt-thread插件及菜單欄
其中rtthread.t32為可以加載的t32文件,而rtthread.men為菜單文件。
task.config D:\work\rt-thread\bsp\raspberry-pi\raspi2\rtthread.t32 menu.reprogram D:\work\rt-thread\bsp\raspberry-pi\raspi2\rtthread.men
4.2 trace32 加載dump以及elf文件
可以通過如下的命令進(jìn)行加載dump文件以及elf文件。
Data.LOAD.Binary D:\work\rt-thread\bsp\raspberry-pi\raspi2\rtt_dump 0x8000 Data.LOAD.Elf D:\work\rt-thread\bsp\raspberry-pi\raspi2\rtthread.elf
加載了符號(hào)文件與dump文件后,可以加載插件文件了。
此時(shí),即可看到系統(tǒng)相關(guān)的信息了。
這樣即使在離線的情況下,也能能夠根據(jù)需要看到信息了。
5.總結(jié)
rt-thread在trace32上的擴(kuò)展插件使用,可以非常方便的分析系統(tǒng)的狀態(tài)。在實(shí)際的使用場(chǎng)合中,往往在測(cè)試階段,不會(huì)用到在線的調(diào)試工具,此時(shí)當(dāng)系統(tǒng)crash發(fā)生后,采用一些dump方案將內(nèi)存dump出來(lái),接著將dump文件與elf文件加載到trace32,并且利用一些系統(tǒng)級(jí)別的插件功能,即可完成系統(tǒng)的分析,非常的簡(jiǎn)潔和高效,文章中只描述了基礎(chǔ)功能,一些復(fù)雜信息的分析需要根據(jù)需求進(jìn)行挖掘。