作者:IAR 在嵌入式軟件開(kāi)發(fā)中,利用完整的應用跟蹤,可為開(kāi)發(fā)人員分析其產(chǎn)品行為提供無(wú)限的可能性。通過(guò)對應用程序的全面了解,他們可以跟蹤每一條指令,看看他們的應用程序是否按照預期運行,或者是否出現錯誤或漏洞。那么,如何才能最大化地利用現有可用的RISC-V跟蹤呢? 什么是跟蹤? 與傳統的通過(guò)設置斷點(diǎn)、printf等進(jìn)行調試相比,跟蹤更像是在不打擾的情況下觀(guān)察你的應用程序;旧,開(kāi)發(fā)人員可以在不干擾程序的情況下觀(guān)察整個(gè)程序的工作情況。跟蹤包括完整的指令執行流程(不需要printf也不需要UART),一旦跟蹤數據被捕獲,你可以快速追溯,并隔離異常和硬故障。 這使得尋找那些罕見(jiàn)的、依賴(lài)于執行順序的漏洞變得更加容易,因為這提供了一串線(xiàn)索:程序執行是怎么樣的,按什么順序執行的。這使開(kāi)發(fā)人員能夠準確地了解它們是如何以及為什么總是會(huì )停在一串特殊的代碼上。你可以迅速發(fā)現異常和硬故障,進(jìn)而發(fā)現那些罕見(jiàn)的、依賴(lài)于執行順序的錯誤。如果沒(méi)有跟蹤,當你的程序出現崩潰,就很難重現實(shí)際發(fā)生的情況。 然而,跟蹤不僅僅是為了發(fā)現錯誤。跟蹤還可以進(jìn)行代碼剖析、代碼覆蓋等,你可以實(shí)時(shí)了解你的設備的行為。性能和覆蓋率監測是強大的功能,當你有跟蹤功能時(shí),就可以實(shí)現這些強大的功能。如果你的帶寬夠寬,甚至可以將實(shí)時(shí)跟蹤流整合到你的調試器中。 RISC-V的跟蹤技術(shù) RISC-V組織的主要關(guān)注點(diǎn)之一是為RISC-V制定標準化的規范。對所有RISC-V成員開(kāi)放的各種工作小組,目前正專(zhuān)注于開(kāi)發(fā)制定這些規范。其中一個(gè)例子是處理器跟蹤工作組,該工作組在2020年2月批準發(fā)布了處理器跟蹤規范。另一個(gè)例子是Nexus跟蹤小組,該小組致力于研究如何使用Nexus IEEE-ISTO 5001™標準針對RISC-V內核定義的跟蹤技術(shù)。 這類(lèi)工作將持續進(jìn)行,因為必須考慮跟蹤標準的所有方面。其中,包括跟蹤控制的輸出格式。最低的目標是與更成熟的架構的現有標準看齊。如果RISC-V跟蹤規范做得好,它將使現有的跟蹤查看器、硬件跟蹤探頭和跟蹤分析工具易于采用。目前已經(jīng)有一些實(shí)現的方案,但RISC-V架構應該在從物聯(lián)網(wǎng)到服務(wù)器的每個(gè)設備中都有跟蹤,即使是簡(jiǎn)單、標準的跟蹤也比完全沒(méi)有跟蹤好。 ![]() 圖1 來(lái)自一個(gè)RISC-V設備的跟蹤 看清每條指令 軟件開(kāi)發(fā)工具中集成對跟蹤的支持增強了日常的代碼開(kāi)發(fā)/調試。跟蹤應該是設計人員日常環(huán)境中固有的一部分,而不應該是事后分析的東西。因此,你可以寫(xiě)代碼并運行,看看是如何到達當前的執行點(diǎn)的。通過(guò)快速追溯、隔離異常和硬故障的功能,你可以直接迭代并獲得良好的代碼質(zhì)量。你還可以找到依賴(lài)于執行順序的漏洞,并找到可以與你的程序流程相關(guān)聯(lián)的功耗測量值。所有這些分析也可以在具有挑戰性和復雜依賴(lài)性的多核環(huán)境下進(jìn)行。 在尋找一個(gè)漏洞時(shí),翻閱捕獲的跟蹤的難度無(wú)異于大海撈針。在短短幾秒鐘的執行時(shí)間里,可以產(chǎn)生數以?xún)|計的指令。因此,極為重要的是,規范將提供足夠的觸發(fā)器,以便能夠將捕獲限制在特定區域。先進(jìn)的導航和搜索功能是必不可少的,如果你的編譯器/調試器工具提供該功能,則可以使用跟蹤觸發(fā)器將跟蹤數據限制在你需要的范圍內。 為什么需要跟蹤? 在設備中植入跟蹤單元,讓你有可能在產(chǎn)品運行時(shí)進(jìn)行非侵入性的跟蹤。因為即使添加非常底層的調試打印輸出,也會(huì )改變應用程序的時(shí)間,并掩蓋其真實(shí)行為。 有許多方法可以捕捉和獲得從設備中輸出的跟蹤數據: 順序排列 - 足夠的PC采樣跟蹤(對統計代碼剖析研究有好處) - 輕型儀器、實(shí)時(shí)操作系統(RTOS)監控、變量跟蹤等 - 配備優(yōu)秀的探針,有可能達到幾兆字節/秒的速度 高速并行接口(4至16位的雙邊接口) - 捕獲一切(時(shí)鐘速度可以很高) - 通過(guò)控制流轉移時(shí)留下的信息進(jìn)行跟蹤 - 為你執行的每一條指令提供保證 - 指令執行過(guò)程信息實(shí)時(shí)存儲在調試器探針上 RAM緩沖區 - 要么是小的專(zhuān)用RAM,要么與系統內存共享 - 即使是4KB的跟蹤RAM也能提供足夠的功能,真正發(fā)揮作用 高速排列 - 速度為10Gbits/s或更高 - 主要適用于較大的、復雜的系統 通過(guò)功能接口進(jìn)行跟蹤(USB3.0提供了超高帶寬。 - 使用案例有限——對小型物聯(lián)網(wǎng)設備來(lái)說(shuō)不是一個(gè)選擇 調試異常情況 通過(guò)在日常工作中使用跟蹤,你可以真實(shí)看到應用程序是如何運行的。你可以檢查程序流,直到一個(gè)特定的狀態(tài),如應用程序崩潰,然后使用跟蹤數據來(lái)定位問(wèn)題的起源。 異;蛭刺幚淼墓收峡梢杂芍羔槅(wèn)題、非法指令或數據中止引起。通常,當這種情況發(fā)生時(shí),你的堆棧(和函數調用信息)會(huì )被毀掉,但通過(guò)跟蹤,你可以獲得完整的應用程序歷史記錄。跟蹤數據對于定位那些顯現不規則且零星發(fā)生的編程錯誤也很有用。這可以幫助發(fā)現價(jià)值“百萬(wàn)美元”的漏洞。 硬件和軟件工具的集成 獲得盡可能高質(zhì)量的代碼的最佳方法是將跟蹤分析能力整合到你的日常開(kāi)發(fā)環(huán)境中。如果你能在每次部署變化時(shí)驗證程序時(shí)序和正確性,那么將復雜的漏洞推給后期系統驗證甚至客戶(hù)的風(fēng)險就會(huì )大大降低。最好的解決方案是擁有像跟蹤調試探針這樣的硬件工具,它可以在你的集成開(kāi)發(fā)環(huán)境中與軟件工具無(wú)縫協(xié)作。例如,IAR提供跟蹤探頭I-jet Trace,它與完整的C/C++編譯器和調試器工具鏈IAR Embedded Workbench完全集成。 I-jet Trace解鎖了IAR Embedded Workbench 集成開(kāi)發(fā)環(huán)境中的一些高級功能。在圖2中,你可以看到幾個(gè)高級視圖功能的例子,上面是時(shí)間軸,下面是代碼堆棧。這顯示的是運行中的程序正在進(jìn)行復雜的函數調用,并且中斷也在同步觸發(fā)。藍色部分顯示的是數據跟蹤,這樣你就可以獲得儀表化的顯示,并看到RTOS的切換等。下面的詳細圖顯示了啟動(dòng)代碼的運行情況——有復雜的調用,還有一些較長(cháng)和較短的函數,甚至還有一個(gè)工具提示來(lái)優(yōu)化其中一個(gè)調用的代碼。 ![]() 圖2 結合調用堆棧和中斷以及變量記錄的時(shí)間軸實(shí)例 代碼質(zhì)量 但是,跟蹤不僅僅是為了發(fā)現漏洞。它還可以幫助你監控你的應用程序——它是否按照預期運行?集成性能監控是使用跟蹤的主要好處之一,因為它可以幫助你了解應用程序執行時(shí)間都花在哪里了,是否受到中斷風(fēng)暴的影響,是否有時(shí)反應不夠快等等。 代碼覆蓋率也是一個(gè)可以用跟蹤實(shí)現的功能(圖3展示了它在IAR Embedded Workbench中的樣子)。這可以用來(lái)證明代碼至少被運行過(guò)一次,查找出未運行的代碼,顯示測試的缺陷等等。功能安全認證強烈建議將代碼覆蓋率作為提高質(zhì)量的一個(gè)手段。靜態(tài)代碼分析工具是對跟蹤分析器一個(gè)很好的補充。這可以確保代碼符合特定行業(yè)的標準和最佳編程實(shí)踐。除了覆蓋率,該工具還可以收集每個(gè)單獨指令的執行次數。例如,有些指令塊被執行了4次,有些被執行了12次。很明顯,沒(méi)有被覆蓋的代碼執行了0次。 ![]() 圖3 跟蹤也可以審查代碼覆蓋率 總結 跟蹤提供了各種有益的數據源,如收集數據或協(xié)助開(kāi)發(fā)人員將信息過(guò)濾成實(shí)際的知識和見(jiàn)解。用不同的跟蹤查看器進(jìn)行可視化和分析,可以創(chuàng )建一個(gè)產(chǎn)品如何運行及其動(dòng)態(tài)行為的真實(shí)描述,為開(kāi)發(fā)人員提供必要的信息,以跟蹤那些很難,甚至不可能通過(guò)其他手段捕捉的復雜漏洞。通過(guò)在日常開(kāi)發(fā)中加入跟蹤,開(kāi)發(fā)人員可以加速軟件開(kāi)發(fā)過(guò)程,提高軟件質(zhì)量。 |