1 RISC-V指令异常调试实例-德赢Vwin官网 网
0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RISC-V指令异常调试实例

嵌入式USB开发 来源:嵌入式USB开发 作者:嵌入式USB开发 2023-06-08 10:50 次阅读

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

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》,从异常原因入手,逐渐反推,确认异常触发点然后确定原因。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 指令
    +关注

    关注

    1

    文章

    607

    浏览量

    35692
  • 调试
    +关注

    关注

    7

    文章

    578

    浏览量

    33923
  • 命令
    +关注

    关注

    5

    文章

    683

    浏览量

    22011
  • RISC-V
    +关注

    关注

    45

    文章

    2270

    浏览量

    46125
收藏 人收藏

    评论

    相关推荐

    正式的RISC-V基础指令集架构与特权架构规范来了,RISC-V基金会已正式批准

    根据RISC-V基金会官网发布的公告,RISC-V 基金会宣布了批准RISC-V 基础指令集架构与特权架构规范,为 RISC-V的可扩展性进
    的头像 发表于 07-11 10:46 9859次阅读

    RISC-V指令集架构特点

    RISC-V是当下热门的技术,值得大家学习,这里分享一份关于RISC-V指令的内容给大家。
    的头像 发表于 10-14 09:08 3589次阅读

    RISC-V的Store AMO access fault调试实例

    本文以一个实例分享RISC-V的Store AMO access fault异常调试过程。Store AMO access fault主要发生在非法地址访问时(栈溢出,指针
    的头像 发表于 06-08 11:10 4520次阅读
    <b class='flag-5'>RISC-V</b>的Store AMO access fault<b class='flag-5'>调试</b><b class='flag-5'>实例</b>

    RISC-V PMP调试

    RISC-V PMP调试
    的头像 发表于 06-08 11:52 1917次阅读
    <b class='flag-5'>RISC-V</b> PMP<b class='flag-5'>调试</b>

    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指令集概述

    RISC-V就是RISC的第五代指令集架构。而RISC-V目标就是“成为一种完全开放的指令集架构,可被任何学术机构或商业组织自由使用”。
    发表于 11-30 23:30

    什么是RISC-VRISC-V指令具有哪些特点应用?

    什么是RISC-VRISC-V指令具有哪些特点应用?自己怎么才能设计出设计一套指令集?
    发表于 10-14 09:05

    RISC-V 发展

    不完善的地方,有传言未来可能会形成x86、ARM、RISC-V三足鼎立的天下,但能够形成这个局面,还需要大家的共同努力。RISC-V指令RISC-V
    发表于 04-14 10:18

    关于RISC-V的P扩展简述与实例解析

    在研究RISC-V指令集的时候,其指令是模块化的,这就为其指令的扩展提供了更多的可能性。下面仅代表我对RISC
    的头像 发表于 04-27 11:30 7427次阅读
    关于<b class='flag-5'>RISC-V</b>的P扩展简述与<b class='flag-5'>实例</b>解析

    RISC-V调试标准及跟踪技术

    本文主要详细介绍了RISC-V调试标准以及RISC-V的跟踪技术,感兴趣的小伙伴跟小编一起了解一下吧。
    的头像 发表于 06-23 17:19 2927次阅读
    <b class='flag-5'>RISC-V</b>的<b class='flag-5'>调试</b>标准及跟踪技术

    第一届RISC-V中国峰会看点 risc-v开发要怎么优化risc-v指令集架构代码密度

    在第一届RISC-V中国峰会上看点很多,RISC-V是开源的,那么代码密度要怎么控制,会不会因为开源而导致代码密度特别大? 我们一起来看看risc-v峰会其中一个非常重要的亮点;卡姆派乐信息科技有限公司解读针对
    发表于 06-23 18:22 9674次阅读
    第一届<b class='flag-5'>RISC-V</b>中国峰会看点 <b class='flag-5'>risc-v</b>开发要怎么优化<b class='flag-5'>risc-v</b><b class='flag-5'>指令</b>集架构代码密度

    简单讲讲RISC-V指令集CPU的参数

    本次CPU采用32位RISC-V指令集架构(一代是自己瞎编指令集)。指令集就是程序指令的集合,指引硬件如何设计、如何运行。
    的头像 发表于 08-07 14:55 3645次阅读
    简单讲讲<b class='flag-5'>RISC-V</b><b class='flag-5'>指令</b>集CPU的参数

    RISC-V CPU调试机制的设计原理

    本文将详细介绍RISC-V CPU调试机制的设计原理。
    发表于 10-18 09:19 2230次阅读

    RISC-V调试和完善的跟踪解决方案

    RISC-V调试和完善的跟踪解决方案ppt分享
    发表于 07-14 17:15 0次下载