Ozone可以幫助用戶快速分析和查找導致CPU故障的軟件bug。本文解釋如何使用Ozone的調試功能,深入了解Cortex-M架構上的這些錯誤。
故障分析流程
我們首先基于一個示例應用程序演示Ozone的故障分析工作流。示例應用程序可以生成不同類型的Cortex-M故障,工程下載鏈接https://wiki.segger.com/File:CortexM_FaultTest.zip(請復制鏈接到瀏覽器下載)。在下圖中,示例應用程序被下載到SEGGER Cortex-M trace參考板,調試工具使用J-Trace PRO。程序執行到函數_NoThumbFunc中,PC位于跳轉到地址0的指令處,由于在地址0處是一條Thumb指令,繼續執行程序將導致Cortex-M CPU故障。恢復程序執行,看看Ozone是如何處理故障。
目標異常對話框
點擊GO后,程序執行中斷,Ozone彈出目標異常對話框:
目標異常對話框描述了CPU故障及其系統寄存器上下文。本例中,SHCSR寄存器的USGFAULTACT位表示發生了一個Cortex-M UsageFault異常。寄存器UFSR提供了發生的UsageFault異常的具體類型。示例中,INVSTATE位被置位,表示指令在無效的CPU狀態下執行。USGFAULTENA字段表示啟用了UsageFault處理程序,否則異常將升級為HardFault。異常寄存器上下文的解釋與特定體系結構相關,Ozone旨在通過異常描述顯示盡可能多的處理信息,當程序執行停止并且目標處于異常狀態時,會顯示目標異常對話框。
向量捕獲
當調試會話開始時,Ozone設置捕獲所有Cortex-M故障向量,在程序進入錯誤處理程序時立即中斷執行,也使Ozone能夠在故障進入時立即彈出目標異常對話框。可以通過Ozone的Break&Tracepoints窗口設置或清除某個向量捕獲。Ozone也提供命令Break.SetVectorCatch以編程方式設置目標的向量捕獲狀態。例如,該命令可以用來修改Ozone在調試會話開始時的默認vector catch 的行為,該命令在項目腳本函數OnProjectLoad中使用。
調試窗口
使用Ozone的調試窗口來進一步了解故障。
Call Stack窗口表示目標處于UsageFault異常狀態。該窗口還指出故障源自函數_NoThumbFunc。在Call Stack窗口中選擇_NoThumbFunc調用幀,Ozone的調用幀感知調試窗口將輸出切換到所選幀的執行上下文。Local Data窗口表明在_NoThumbFunc函數中執行了一個到地址0的跳轉,導致CPU在ARM狀態下執行Thumb指令。查看Ozone的寄存器窗口,寄存器UFSR確認CPU已經發出INVSTATE UsageFault。這是Ozone基本故障分析工作流程。
嵌套的異常
Ozone可以提供關于Cortex-M上嵌套異常和嵌套故障的準確信息。為了演示這一點,讓我們繼續調試前一節的示例應用程序。我們現在用一條未定義的指令覆蓋UsageFault處理程序的單個分支指令:
在跳過0x8000384地址的未定義指令后,Ozone的目標異常對話框再次彈出:
對話框通知搶占了UsageFault異常的為HardFault異常。除了寄存器字段INVSTATE之外,還設置了字段UNDEFINSTR。這表明在調用路徑中發生了兩種類型的UsageFault異常。HFSR寄存器字段FORCED進一步表明UNDEFINSTR異常已經升級為HardFault。
由于Cortex-M CPU現在正在處理嵌套異常,Ozone的Call Stack窗口相應更新:
在多個堆棧上嵌套異常
關于嵌套異常的信息可以占用兩個堆棧,如下一個示例所示,在這種情況下,Ozone能夠提供準確的調用堆棧和本地數據信息。本例中,程序執行已停止在調用堆棧5級的SVC指令上:
在執行SVC調用之后,在處理程序模式下執行了一個附加的函數調用路徑。應用程序現在停止在load加載指令上,該指令即將從無效地址0x100000加載:
此時,Ozone的Call Stack窗口表明堆棧交換已經發生。從表列stack Used中堆棧使用值0的位置,用戶可以看到:
上面的調用幀,包括SVC_Handler都在主棧上。
下面的調用幀,包括SVCall Exception)位于進程堆棧上。
當前使用了40字節的主堆棧和88字節的進程堆棧。
注意,Ozone用尖括號括起了特定于目標的調用幀。繼續執行程序,看看Ozone是如何處理即將發生的故障。程序恢復執行后,立即彈出目標異常對話框,指示HardFault異常:
由于沒有啟用BusFault異常處理程序,Cortex-M將BusFault異常升級為HardFault。寄存器字段PRECISERR表示發生了精確的BusFault異常。字段BFARVALID表示錯誤的load/store指令的內存訪問地址可用。Ozone將所有這些信息集成到目標異常對話框頂部區域中的異常描述中。字段SVCALLACT進一步表明,一個SVC處理程序已被當前異常搶占。
關閉目標異常對話框,使用Ozone的調試窗口進一步調查故障。
如上圖所示,Ozone的調用幀感知調試窗口提供了故障的清晰圖像:Local data窗口顯示了解引用數據指針的無效值。Call Stack窗口顯示完整的程序執行路徑,跟蹤多個嵌套異常和CPU堆棧。用戶可以在register窗口中查詢到相同信息。
使用Trace分析故障
在不精確的故障場景中,當Cortex-M內核無法提供故障指令的精確PC時,可以使用Ozone的trace窗口來快速識別故障指令,確定更復雜故障的原因,特別是不精確的故障。
如上圖所示,使用Ozone的回溯特性,可以很容易地將不精確的BusFault異常追溯到出錯的存儲指令。
Ozone是一塊面向嵌入式應用程序的調試器。使用Ozone,可以在C/ C++ /Rust源代碼和匯編級別調試嵌入式應用。Ozone與J-Link和J-Trace緊密集成,提供豐富的調試分析功能。
-
寄存器
+關注
關注
31文章
5343瀏覽量
120416 -
cpu
+關注
關注
68文章
10869瀏覽量
211857 -
應用程序
+關注
關注
37文章
3271瀏覽量
57721 -
Cortex-M
+關注
關注
2文章
229瀏覽量
29770
原文標題:如何使用Ozone分析Cortex-M異常
文章出處:【微信號:麥克泰技術,微信公眾號:麥克泰技術】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論