ARM深入理解-hypervisor调试方法二(QEMU+GDB调试ARM程序)

简介: ARM深入理解-hypervisor调试方法二(QEMU+GDB调试ARM程序)

通过GDB调试代码的便利性无需赘言。我们直接以调试meta-hypervisor为示例进行说明。


准备工作


  • 代码
    代码请参考meta-hypervisormeta-demos。代码里边有详细的说明文档。
  • QEMU
    安装qemu-system-aarch64,版本要求大于5.0


启动QEMU


启动QEMU的命令:

qemu_cmd:=qemu-system-aarch64
run: platform
    @$(qemu_cmd) -nographic\
        -M virt,secure=on,virtualization=on,gic-version=3 \
        -cpu cortex-a53 -smp 4 -m 4G\
        -bios $(atf-fip)\
        -device loader,file="$(meta_image)",addr=0x50000000,force-raw=on\
        -device virtio-net-device,netdev=net0\
        -netdev user,id=net0,net=192.168.42.0/24,hostfwd=tcp:127.0.0.1:5555-:22\
        -device virtio-serial-device -chardev pty,id=serial3 -device virtconsole,chardev=serial3\
        -S -s
  • -bios $(atf-fip)
    atf-fip是指编译出的ATFU-boot的二进制文件。
  • -device loader,file="$(meta_image)",addr=0x50000000,force-raw=on
    meta_image指的是meta-hypervisor的二进制代码。addr=0x50000000指的是加载到物理内存0x50000000地址处。
  • -M virt,secure=on,virtualization=on,gic-version=3
    指定需要使用的machine类型,virtqemu提供的一个通用machine,可以同时支持arm32arm64(部分cortex不支持),-M help可以列出所有支持的machine列表。
    secure=on是支持安全空间。
    virtualization=on是支持虚拟化扩展。
    gic-version=3是支持GICv3通用中断控制器类型。
  • -cpu cortex-a53 -smp 4 -m 4G
    -cpu cortex-a53:指定模拟的CPU类型。可以使用-cpu help,查看当前支持的CPU类型。
    -m 4G:指定内存大小。
    -smp 4:指定CPU核的数量,默认是1
    -s -S:可选,调试参数。-S,可以让qemu加载image到指定位置后停止运行,等待gdb连接;-s, 等价于--gdb tcp::1234,启动gdb server并默认监听1234端口。


启动gdb客户端


再打开一个命令行窗口:

gdb-multiarch --tui ./bin/qemu-aarch64-virt/meta.elf

启动后的界面,如下所示:

640.png

连接gdb-server

(gdb) target remote localhost:1234

cpu_init函数打breakpoint。然后,执行命令continue。回到gdb-server端,输入go 0x50000000开始运行程序。

gdb客户端,执行单步执行,最后发现是mem_init_vm_config(config_addr)函数执行出现问题。打印变量print/x config_addr,结果是1。而我们配置平台的物理内存是从0x40000000处开始的。这样,等于我们访问非法物理地址。


用VSCode可视化环境调试


vscode中集成了gdb功能,我们可以用它来图形化的调试meta-hypervisor

首先,我们按下ctrl+alt+D,调出debug窗口,选择创建launch.json文件,添加vscodegdb配置文件(.vscode/launch.json):

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb-multiarch) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/wrkdir/srcs/meta/bin/qemu-aarch64-virt/meta.elf",
            "cwd": "${workspaceFolder}",
            "MIMode": "gdb",
            "miDebuggerPath": "/usr/bin/gdb-multiarch",
            "miDebuggerServerAddress": "localhost:1234"
        }
    ]
}

这里对几个重点参数做一些说明:

  • program: 调试的符号文件
  • miDebuggerPathgdb的路径, 这里需要注意的是,由于我们是arm64内核,因此需要用gdb-multiarch来进行调试
  • miDebuggerServerAddress:对端地址,qemu会默认使用1234这个端口

配置完成之后,可以直接启动GDB, 连接上meta-hypervisorgdb-server端的启动顺序参考前面的一段),界面如下所示:

640.png


vscode中,可以设置断点,进行单步调试。可以查看变量、通用寄存器、系统寄存器、浮点寄存器等。还可以查看调用栈的过程。具体如下红色方框和文字注释所示:


640.png

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
22天前
|
NoSQL 编译器 C语言
C语言调试是开发中的重要技能,涵盖基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。
C语言调试是开发中的重要技能,涵盖基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。高级技巧包括内存检查、性能分析和符号调试。通过实践案例学习如何有效定位和解决问题,同时注意保持耐心、合理利用工具、记录过程并避免过度调试,以提高编程能力和开发效率。
37 1
|
4月前
|
NoSQL Linux C语言
Linux GDB 调试
Linux GDB 调试
68 10
|
3月前
|
Ubuntu KVM 虚拟化
基于ARM64的Qemu/KVM学习环境搭建
基于ARM64的Qemu/KVM学习环境搭建
|
4月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
132 3
|
4月前
|
Linux 网络安全 开发工具
内核实验(二):自定义一个迷你Linux ARM系统,基于Kernel v5.15.102, Busybox,Qemu
本文介绍了如何基于Linux Kernel 5.15.102版本和BusyBox创建一个自定义的迷你Linux ARM系统,并使用QEMU进行启动和调试,包括内核和BusyBox的编译配置、根文件系统的制作以及运行QEMU时的命令和参数设置。
370 0
内核实验(二):自定义一个迷你Linux ARM系统,基于Kernel v5.15.102, Busybox,Qemu
|
4月前
|
NoSQL Linux 编译器
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
如何配置环境并使用QEMU虚拟机结合GDB进行Linux内核代码的断点调试,包括安装QEMU、交叉编译工具链,编译内核以及通过GDB远程连接进行调试的详细步骤。
189 0
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
|
3月前
|
Ubuntu NoSQL Linux
在Ubuntu上用Qemu模拟ARM版本的Fedora39
在Ubuntu上用Qemu模拟ARM版本的Fedora39
|
3月前
|
NoSQL Ubuntu Linux
基于ARM64的Qemu/KVM学习环境搭建2
基于ARM64的Qemu/KVM学习环境搭建2
|
3月前
|
Go 开发工具 git
在Qemu+ARM上运行Minix3内核
在Qemu+ARM上运行Minix3内核