【博文精选】eclipse联和DGB在qemu平台调试riscv linux

之前说到了,如何在qemu上,运行riscv kernel。下面说一下,如何使用eclipse+GDB,在qemu平台上调试kernel。

${SIFIVE_DIR}是freedom-u-sdk开源项目的本地跟目录。

一、配置bbl

配置bootloader,生成调试信息。

进入到${SIFIVE_DIR}/work/riscv-pk目录,这个目录是编译riscv-pk的目录。

执行如下命令:

rm $SIFIVE_DIR/work/riscv-pk/*

cd $SIFIVE_DIR/work/riscv-pk

PATH=$SIFIVE_DIR/work/buildroot_initramfs/host/bin:$PATH $SIFIVE_DIR/riscv-pk/configure \

--host=riscv64-buildroot-linux-gnu \

--enable-logo \

--with-logo=$SIFIVE_DIR/conf/sifive_logo.txt

CFLAGS="-mabi=lp64d -march=rv64imafdc -g" LDFLAGS='-g' make PATH=$SIFIVE_DIR/work/buildroot_initramfs/host/bin:$PATH -C $SIFIVE_DIR/work/riscv-pk

主要是给CFLAGS和LDFLAGS变量,加上-g参数。

编译完成后,使用readelf -S bbl,查看生成的bbl,是否带有debug信息。有.debug*段即可。

二、配置kernel

配置kernel,生成调试信息。

进入到${SIFIVE_DIR}/linux目录,执行 make ARCH=riscv menuconfig O=${SIFIVE_DIR} /work/linux。

O选项,指定该目录,是linux kernel的编译目录。

在 kernel hacking->compile-time checks and compiler options 选项页,勾选第一个Compile the kernel with debug info。

重新make O=${SIFIVE_DIR} /work/linux vmlinux,生成vmlinux。

使用 readelf -S vmlinux 查看vmlinux的section,如果有下图所示的.debug**段,说明,vmlinux带了有debug信息。

三、调试方式启动qemu

qemu的-s和-S参数,可以启动调试模式。

$SIFIVE_DIR/work/riscv-qemu/prefix/bin/qemu-system-riscv64 -nographic -machine virt -bios $SIFIVE_DIR/work/riscv-pk/bbl -kernel $SIFIVE_DIR/work/linux/vmlinux -initrd $SIFIVE_DIR/work/initramfs.cpio.gz -netdev user,id=net0 -device virtio-net-device,netdev=net0 -s -S

四、eclipse连接

启动eclipse工具,先建一个project。

project建立好之后,配置debug。

在main界面,选择project为刚刚建立的project,勾选Disable auto build。

在debugger界面,Debugger选择gdbserver,配置DGB调试器的路径,这里使用riscv64-unknown-linux-gnu-gdb。

我本机上的gdb版本是8.2。

lujun@lujun-host:~$ /opt/riscv-gcc/bin/riscv64-unknown-linux-gnu-gdb -version

GNU gdb (GDB) 8.2.50.20181127-git

Copyright (C) 2018 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software: you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law.

connection选项页,host name填localhost,port填1234。qemu的-s选项,会创建1234端口,用于gdb连接调试。

设置完毕之后,选择右下角的debug。开启调试。

五、调试bbl

启动调试之后,在debug子界面,选择Process[1]->Thread#11->0x1000。0x1000表示,此时cpu停在了0x1000地址处。这个地址也就是riscv-qemu的复位地址。

点击view Disassembly,可以看到反汇编。

在console界面,会有如下的warning提示,并且没有显示0x1000地址的反汇编。因为这个时候cpu执行的指令,是在qemu中固化的。因此不能调试。

Type "apropos word" to search for commands related to "word".

warning: No executable has been specified and target does not support

determining executable automatically. Try using the "file" command.

0x0000000000001000 in ?? ()

在console界面,输入如下命令,载入bbl,设置断点为bbl的起始label,

file /home/lujun/work/sifive/freedom-u-sdk/work/riscv-pk/bbl

b reset_vector

执行结果如下:

file /home/lujun/work/sifive/freedom-u-sdk/work/riscv-pk/bbl

A program is being debugged already.

Are you sure you want to change the file? (y or n) [answered Y; input not from terminal]

Reading symbols from /home/lujun/work/sifive/freedom-u-sdk/work/riscv-pk/bbl...

b reset_vector

Breakpoint 1 at 0x80000000: file /home/lujun/work/sifive/freedom-u-sdk/riscv-pk/machine/mentry.S, line 37.

file命令,是载入一个elf程序。b命令设置一个断点。bbl的起始执行的label是reset_vector。

点击eclipse工具的run按钮,启动执行。过一会,cpu就会在设置的断点处停下来。我们就可以调试bbl的程序。

六、调试kernel

通过file命令,载入vmlinux,设置断点为start_kernel。

file /home/lujun/work/sifive/freedom-u-sdk/work/linux/vmlinux

A program is being debugged already.

Are you sure you want to change the file? (y or n) [answered Y; input not from terminal]

Load new symbol table from "/home/lujun/work/sifive/freedom-u-sdk/work/linux/vmlinux"? (y or n) [answered Y; input not from terminal]

Reading symbols from /home/lujun/work/sifive/freedom-u-sdk/work/linux/vmlinux...

Error in re-setting breakpoint 1: Function "reset_vector" not defined.

b start_kernel

Breakpoint 2 at 0xffffffe00000063c: file /home/lujun/work/sifive/freedom-u-sdk/linux/init/main.c, line 536.

点击eclipse工具的run按钮,启动执行。过一会,cpu就会在设置的断点处停下来。我们就可以调试kernel的程序。

七、总结

借助qemu,eclipse以及GDB工具,我们可以对bbl和kernel进行调试。

这个版本的GDB有点问题,需要改代码,然后重新编译生成。大家在遇到的时候,直接百度错误结果,根据百度结果修改代码,重新编译即可。

 

(0)

相关推荐

  • GDB串行协议概述

    GDB串行协议概述 1.概述 2.GDB Server的作用 3.一个标准的gdb的调试过程 4.GDB 远程串行协议解析 5.小结 1.概述 做嵌入式开发时,很多时候都会使用到GDB,从底层去理解G ...

  • 【博文精选】riscv linux在qemu上仿真

    经过几天的斗争,终于在qemu上,成功跑通了linux.下面将整个流程,记录下. 大致分为如下几步: 编译工具链 编译linux kernel 编译bootloader 编译跟文件系统 编译qemu ...

  • 颇可玩主博文精选 | 超全星空摄影拍摄技巧

    人类从古以来,便有"星空情结".无论是<小王子>里温暖的星空,还是梵高笔下的<星月夜>,都让人无限向往.璀璨的星空,一直也是风光摄影师最喜欢的题材之一. 其 ...

  • Maven依赖管理总结 #CSDN博文精选# #依赖管理# #IT# #第三方集成#

    大家好,小C将继续与你们见面,带来精选的CSDN博文~ 在这里,你将收获: 将系统化学习理论运用于实践,系统学习IT技术 学习内容涵盖数据库.软件测试.主流框架.领域驱动设计和第三方生态等,离全栈工程 ...

  • 【博文精选】如何向riscv-gcc中增加编译器内置宏

    riscv-gcc工具,有内置的一些宏参数.我们可以根据这些内置的宏参数,判断编译器的行为. 一.查看gcc内置宏参数 这里以芯来科技发布的riscv-nuclei-elf-gcc工具链为例. 使用以 ...

  • 【博文精选】静态SRAM芯片工作原理

    下面谈谈当存储字节的过程是怎样的:下面的示意图显示的也仅仅是最简单状态下的情况,当内存条上仅剩一个RAM芯片的情况.对于X86处理器,它通过地址总线发出一个具有22位二进制数字的地址编码--其中11位 ...

  • 【博文精选】PCIe中的Crosslink与Multi-Root/Multi-Processor系统

    在PCIe总线中,Switch是一个特殊的设备,该设备由1个上游端口和2~n个下游端口组成.PCIe总线规定,在一个Switch中可以与RC直接或者间接相连的端口为上游端口,在PCIe总线中,RC的位 ...

  • 【博文精选】Synplify Pro的RTL视图与Technology视图以及优化分析

    在进行Verilog/VHDL Coding的时候,很多人喜欢先通过检查设计的RTL视图是否符合预期,然后在通过功能仿真和时序仿真来验证设计的功能正确性. 以Lattice Diamond/Radia ...

  • 【博文精选】信号完整性分析——阻抗匹配与信号反射

    信号沿传输线向前传播时,每时每刻都会感受到一个瞬态阻抗,这个阻抗可能是传输线本身的,也可能是中途或末端其他元件的.对于信号来说,它不会区分是什么,信号所感受到的只有阻抗.如果信号感受到的阻抗是恒定的, ...

  • 【博文精选】ECP5/ECP5-5G SerDes复位解读

    这篇文章将详细地聊一聊ECP5/ECP5-5G SerDes的复位结构,以及需要的注意事项.考虑到SerDes/PCS是整个FPGA中最为复杂的数模混合设计,其对上电/复位顺序有着严格的要求.为了方便 ...