RISC-V的Store AMO access fault調(diào)試實例 (qq.com)
前言
本文以一個實例分享RISC-V的Store AMO access fault異常的調(diào)試過程。Store AMO access fault主要發(fā)生在非法地址訪問時(棧溢出,指針異常等)。
過程
現(xiàn)象是程序運行時進入了異常中斷,如下
使用bt回溯可以看到進入了異常處理函數(shù)exception ()
(gdb) bt
......
#6 0x02002eb2 in exception () at src/lib/riscv/src/exception.c:55
#7 0x00000000 in ?? ()
Backtrace stopped: frame did not save the PC
(gdb)
那么首先想到的是確認異常原因
查看異常寄存器:info reg mcause
可以看到異常原因是0x07

對應的是Store/AMO access fault 異常,這是一個寫數(shù)據(jù)時的異常.

那么接下來就要確認寫哪個地方的數(shù)據(jù)錯誤了呢?
我們可以通過info reg mtval 查看mtval寄存器看到。
寫0x28382ad0時產(chǎn)生了異常.

那么什么時候?qū)戇@個地址導致了異常呢,之前bt已經(jīng)看不到回溯的地方了。
我們可以使用數(shù)據(jù)斷點來監(jiān)控
設置數(shù)據(jù)斷點 watch (unsigned int )0x28382ad0
重新加載程序運行 load
c運行
看到斷點停在了memset函數(shù)處,這印證了我們前面分析的是寫數(shù)據(jù)導致的問題

繼續(xù)bt查看

我們找到對應的代碼處

看下memset的參數(shù),如果看不到可以在memset前打斷點重新運行

最終確認確實是棧初始化時寫0x28382ad0這個地址的內(nèi)容錯誤,原因是不具備寫屬性導致異常
(gdb) p pxStack
$8 = (StackType_t *) 0x28382ad0
(gdb)

當然為什么這個地址不能寫和這里沒關(guān)系了,是另外一回事了,是我們的環(huán)境DDR的問題。
總結(jié)
以上是一個分析實例的過程,遇到類似問題可以參考。有幾個關(guān)鍵點一是確認異常原因,異常訪問的地址,然后通過數(shù)據(jù)斷點確認什么時候訪問了這個地址,到此基本就確認問題了,后面就順藤摸瓜了。
審核編輯:湯梓紅
-
嵌入式
+關(guān)注
關(guān)注
5198文章
20442瀏覽量
333986 -
調(diào)試
+關(guān)注
關(guān)注
7文章
646瀏覽量
35652 -
指針
+關(guān)注
關(guān)注
1文章
484瀏覽量
71843 -
RISC-V
+關(guān)注
關(guān)注
48文章
2887瀏覽量
52989
發(fā)布評論請先 登錄
RISC-V工作模式及寄存器基本知識
RISC-V規(guī)范的演進 RISC-V何時爆發(fā)?
使用Eclipse和MCUXpresso IDE調(diào)試RV32M1-VEGA RISC-V開發(fā)板
關(guān)于RISC-V MCU開發(fā)實例(一):環(huán)境搭建
RISC-V學習筆記【1】RISC-V概述
RISC-V設計支持工具,支持RISC-V技術(shù)的基礎(chǔ)
Imagination CPU 系列研討會 | RISC-V 平臺的性能分析和調(diào)試
RISC-V Summit China 2024 青稞RISC-V+接口PHY,賦能RISC-V高效落地
加入全球 RISC-V Advocate 行列,共筑 RISC-V 的未來 !
RISC-V的Store AMO access fault調(diào)試實例
評論