前言
本文以一個簡單的實例介紹RISC-V指令異常的調試過程,思路都是一樣的,遇到其他情況時分析過程也類似。
相關內容參考《riscv-privileged-20211203.pdf》
過程
現象是程序執行后進入了異常中斷,可以通過GDB的bt命令看到
#12 0x02002e9c in exception () at src/lib/riscv/src/exception.c:55
#13 0x02002b40 in is_exception ()
Backtrace stopped: frame did not save the PC
(gdb)
既然是進入了異常中斷,那么就需要確認到底是什么異常,
這可以通過mcause寄存器查看
(gdb) info reg mcause
mcause 0x2 0x2
(gdb)
可以看到是非法指令異常
那么我們就搜索文檔的Illegal instruction可以查看到所有可能導致Illegal instruction的原因。
我們搜到以下信息,即mtval寄存器保存了異常指令,mepc指向了異常指令
可以看到mepc的內容是0,那么猜測應該是函數指針未初始化直接調用導致的
(gdb) info reg mtval
mtval 0x0 0x0
(gdb) info reg mepc
mepc 0x0 0x0
(gdb)
到這里基本就確認了方向了,可以重點看哪些地方有函數指針,或者逐步注釋函數,或者逐步斷點定位即可。
這里很快就確認了是
是如下代碼導致
int xxx_ioctl(unsigned int dev_id, unsigned int cmd, void *data)
{
if (dev_id >= xxx_drv.dev_num)
return -1;
return xxx_drv.ops.ioctl(&(xxx_drv.dev[dev_id]), cmd, data);
}
查看函數指針正好是0
(gdb) p xxx_drv.ops.ioctl
$1 = (int (*)(struct xxx_dev_s *, unsigned int, void *)) 0x0
(gdb)
回溯代碼確認了是某個外設沒有初始化成功則這個回調函數沒有初始化。原因就定位了。
總結
對于異常的調試可以參考手冊《riscv-privileged-20211203.pdf》,從異常原因入手,逐漸反推,確認異常觸發點然后確定原因。
審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
指令
+關注
關注
1文章
607瀏覽量
35710 -
調試
+關注
關注
7文章
578瀏覽量
33936 -
命令
+關注
關注
5文章
684瀏覽量
22021 -
RISC-V
+關注
關注
45文章
2277瀏覽量
46158
發布評論請先 登錄
相關推薦
正式的RISC-V基礎指令集架構與特權架構規范來了,RISC-V基金會已正式批準
根據RISC-V基金會官網發布的公告,RISC-V 基金會宣布了批準RISC-V 基礎指令集架構與特權架構規范,為 RISC-V的可擴展性進
RISC-V的Store AMO access fault調試實例
本文以一個實例分享RISC-V的Store AMO access fault異常的調試過程。Store AMO access fault主要發生在非法地址訪問時(棧溢出,指針
【RISC-V開放架構設計之道|閱讀體驗】RISC-V基礎整數指令集
第2章 RV32I:RISC-V基礎整數指令集
本章重點講解構成RISC-V基礎整數指令集的基本指令和指
發表于 01-31 21:10
關于RISC-V學習路線圖推薦
的編程方法。
學習RISC-V匯編語言 :
了解RISC-V匯編語言的語法和指令格式,編寫簡單的匯編程序。
調試與優化 :
使用調試工具(如
發表于 11-30 15:21
RISC-V 發展
不完善的地方,有傳言未來可能會形成x86、ARM、RISC-V三足鼎立的天下,但能夠形成這個局面,還需要大家的共同努力。RISC-V指令集RISC-V
發表于 04-14 10:18
第一屆RISC-V中國峰會看點 risc-v開發要怎么優化risc-v指令集架構代碼密度
在第一屆RISC-V中國峰會上看點很多,RISC-V是開源的,那么代碼密度要怎么控制,會不會因為開源而導致代碼密度特別大? 我們一起來看看risc-v峰會其中一個非常重要的亮點;卡姆派樂信息科技有限公司解讀針對
發表于 06-23 18:22
?9682次閱讀
評論