网站首页

人工智能P2P分享搜索全网发布信息网站地图标签大全

当前位置:诺佳网 > 电子/半导体 > 嵌入式技术 >

RISC-V指令异常调试实例

时间:2023-06-08 10:50

人气:

作者:admin

标签: 调试  命令  指令  RISC-V 

导读:本文以一个简单的实例介绍RISC-V指令异常的调试过程,思路都是一样的,遇到其他情况时分析过程也类似。...

本文转自公众号,欢迎关注关于

RISC-V指令异常调试实例 (qq.com)

前言

本文以一个简单的实例介绍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》,从异常原因入手,逐渐反推,确认异常触发点然后确定原因。

审核编辑:汤梓红

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信