通过GDB调试代码的便利性无需赘言。我们直接以调试meta-hypervisor为示例进行说明。
准备工作
代码
代码请参考meta-hypervisor和meta-demos。代码里边有详细的说明文档。
QEMU
安装qemu-system-aarch64,版本要求大于5.0。
启动QEMU
启动QEMU的命令:
qemu_cmd:=qemu-system-aarch64 run:platform @$(qemu_cmd)-nographic -Mvirt,secure=on,virtualization=on,gic-version=3 -cpucortex-a53-smp4-m4G -bios$(atf-fip) -deviceloader,file="$(meta_image)",addr=0x50000000,force-raw=on -devicevirtio-net-device,netdev=net0 -netdevuser,id=net0,net=192.168.42.0/24,hostfwd=tcp5555-:22 -devicevirtio-serial-device-chardevpty,id=serial3-devicevirtconsole,chardev=serial3 -S-s
-bios $(atf-fip)
atf-fip是指编译出的ATF和U-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类型,virt是qemu提供的一个通用machine,可以同时支持arm32和arm64(部分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
启动后的界面,如下所示:
连接gdb-server:
(gdb)targetremotelocalhost: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文件,添加vscode的gdb配置文件(.vscode/launch.json):
{ //UseIntelliSensetolearnaboutpossibleattributes. //Hovertoviewdescriptionsofexistingattributes. //Formoreinformation,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: 调试的符号文件
miDebuggerPath:gdb的路径, 这里需要注意的是,由于我们是arm64内核,因此需要用gdb-multiarch来进行调试
miDebuggerServerAddress:对端地址,qemu会默认使用1234这个端口
配置完成之后,可以直接启动GDB, 连接上meta-hypervisor(gdb-server端的启动顺序参考前面的一段),界面如下所示:
在vscode中,可以设置断点,进行单步调试。可以查看变量、通用寄存器、系统寄存器、浮点寄存器等。还可以查看调用栈的过程。具体如下红色方框和文字注释所示:
审核编辑:汤梓红
-
ARM
+关注
关注
134文章
9073浏览量
367228 -
调试
+关注
关注
7文章
576浏览量
33915 -
qemu
+关注
关注
0文章
57浏览量
5345
原文标题:ARM深入理解-hypervisor调试方法二(QEMU+GDB调试ARM程序)
文章出处:【微信号:嵌入式ARM和Linux,微信公众号:嵌入式ARM和Linux】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论