优秀的产品需要有高效的调试手段,RISC-V的工具链中提供GDB。 使得切换到RISCV后,底软和内核工程师的工作效率不受损害。

我们使用一个有趣的程序来尝试gdb调试的效果。源文件 rot13.c 和 链接描述文件spike.lds如下

rot13.c 中,通过变量wait的值,控制程序进入不同阶段:

阶段1: 程序因为 0 == wait, 停留在一个死循环里面。在后面的gdb调试中,我们可以看到通过修改变量wait的值,控制程序进入下一个阶段。

阶段2: 程序执行简单的“解密”运算,将初始化的“密文”解析为“明文”。在gdb中,我们将看到RISC-V demo 作者想告诉我们的信息。

阶段3: 程序结束。

/* file name: rot13.c */
char text[] = "Vafgehpgvba frgf jnag gb or serr!";// Don't use the stack, because sp isn't set up.
volatile int wait = 1;int main()
{while (wait);// Doesn't actually go on the stack, because there are lots of GPRs.int i = 0;while (text[i]) {char lower = text[i] | 32;if (lower >= 'a' && lower <= 'm')text[i] += 13;else if (lower > 'm' && lower <= 'z')text[i] -= 13;i++;}done:while (!wait);
}
/* spike.lds */OUTPUT_ARCH( "riscv" )SECTIONS
{. = 0x10010000;.text : { *(.text) }.data : { *(.data) }
}

1.Build

源码Build 命令如下

$ riscv64-unknown-elf-gcc -g -Og -o rot13-64.o -c rot13.c
$ riscv64-unknown-elf-gcc -g -Og -T spike.lds -nostartfiles -o rot13-64 rot13-64.o

2.调试

2.1 在spike(riscv-isa-sim)上运行程序rot13-64,在9824端口打开调试通道。

2.2  使用openocd 创建一个gdb调试的server, 通过9824端口连接到spike上的riscv实例,并在3333端口等待gdb的连接。

/*spike.cfg*/interface remote_bitbang
remote_bitbang_host localhost
remote_bitbang_port 9824set _CHIPNAME riscv
jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x10e31913set _TARGETNAME $_CHIPNAME.cpu
target create $_TARGETNAME riscv -chain-position $_TARGETNAMEgdb_report_data_abort enableinit
halt

2.3 使用配套的riscv gdb工具进行调试。最终我们得到了demo 作者告诉我们的秘密

“Instrcution sets want to be free!”

gdb 调试 RISC-V相关推荐

  1. RISC V (RV32+RV64) 架构 整体介绍

    文章目录 riscv 市场 芯片介绍 软件介绍 开发板介绍 PC介绍 riscv 架构 编程模型(指令集/寄存器/ABI/SBI) 运行状态 指令集 寄存器 riscv32和riscv64两者的区别 ...

  2. gdb php-fpm,使用 gdb 调试 php-fpm 异常错误

    相关资源下载GDB简介 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC.BCB的图形化调试器更强大的功能. 问题 ...

  3. DPDK之makefile编译选项修改和gdb调试(三)

    摘要 intel dpdk 的makefile 写的很好,该好好学习他的这种架构,但在调试程序时候发现,它的编译选项优化级别很高:怎样去修改intel dpdk中的编译选项,达到自己一个一个满意的程度 ...

  4. 【嵌入式开发】C语言 命令行参数 函数指针 gdb调试

    . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21551397 | http://www.hanshul ...

  5. 用gdb调试core dump文件

    gdb基本的使用方法在此就不说了. 载入core文件的命令行为: dgb exe core 例如 gdb ./testall ./core.2345 最重要的一个命令是where,这个就像windbg ...

  6. 从零上手 GDB 调试,看这个教程就够了~

    前言 在为 Linux 开发应用程序时,很多情况下都需要使用 C 语言进行开发,因此几乎每一位 Linux 程序员面临的首要问题都是:如何灵活运用 C 编译器. 目前 Linux 下最常用的 C 语言 ...

  7. nginx源码分析--使用GDB调试

    在学习优秀的源代码时是少不了源码的跟踪与调试,它不仅是我们解决程序bug的有效途径,也是我们理解.学习优秀源码的有效途径. 本文主要介绍一些源码调试的方法,并结合Nginx源码进行示例. 1,利用GD ...

  8. Linux命令【三】gcc编译+静态库+动态库+makefile+gdb调试

    用C编译器编译源文件:gcc 源文件 -o 可执行文件名 详细步骤: gcc -E a.c -o a.i预处理器将头文件展开,宏替换,去掉注释 gcc -S a.i -o a.s编译器将C文件变成汇编 ...

  9. gdb调试的基本使用

    GDB调试 启动程序准备调试 GDB yourpram 或者 先输入GDB 然后输入 file yourpram然后使用run或者r命令开始程序的执行,也可以使用 run parameter将参数传递 ...

  10. gdb 调试命令的使用及总结

    GDB: The GNU Project Debugger:http://www.gnu.org/software/gdb/documentation/ 参考:http://www.jianshu.c ...

最新文章

  1. 项目开发中的注意事项
  2. java 中jtextfield访问限制_java.swing JtextField 中怎么限制只能输入数字
  3. Vue nextTick 机制
  4. windows下最好的围棋_学围棋能使学习成绩提高吗?
  5. c 语言从大到小排序算法,10 大经典排序算法(动图演示+ C 语言代码)
  6. python安装不了怎么办_python安装运行时提示不是内部或外部命令怎么办
  7. 三菱fx3u通讯手册_使用USR-N510实现局域网内连接FX3U
  8. robotframework--登录接口,post传递多个参数、及获取content中指定属性的值(5)
  9. 学习日记day 10 : JavaScript秋风扫落叶第一期
  10. 如何评价《守望先锋》架构设计?
  11. 学生专用计算机游戏怎么按,学生计算器怎么玩
  12. python羊车门问题_羊车门作业 Python版
  13. 心电matlab,基于matlab检测心电信号
  14. 【多功能小程序】古风姓氏圣诞国庆头像生成小程序源码
  15. minecraft刷怪笼java_Minecraft怪物经验top9!刷怪箱位列第4,杀玩家第2出乎意料
  16. 网络编程-线程,守护线程,线程互斥锁-26
  17. 欧姆龙 PLC CP1E-N30SDR-A 与 NPN型编码器连接
  18. 实现复数类中的运算符重载
  19. SQL Server多语句表值函数
  20. specular图使用方法_KeyShot中Poliigon贴图的使用方法整理

热门文章

  1. 数据库连接的Persist Security Info参数说明
  2. 用python画枫叶-Python中的用for,while循环遍历文件实例
  3. 关于发布后网站调用本地exe的曲线救国之路
  4. 国科大学习资料--最优化计算方法(王晓)--第一次作业答案
  5. 诺贝尔奖获得者平均年龄是多少?属于我们的时间好像不多了
  6. 用vue-cli创建项目后npm run serve 报错Component name “main“ should always be multi-word vue/multi-word-compo
  7. 定时任务组件Quartz
  8. 英雄杀-如何通关挑战
  9. python中整数的长度_Python中正整数的位长度
  10. python处理sa雷达数据存储板_雷达数据处理和风场反演