0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

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

3天内不再提示

QEMU+GDB调试ARM程序

我快闭嘴 来源:嵌入式ARM和Linux 作者:嵌入式ARM和Linux 2022-10-08 09:17 次阅读

通过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

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

66e43c96-469d-11ed-96c9-dac502259ad0.png

连接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端的启动顺序参考前面的一段),界面如下所示:

6709ce3e-469d-11ed-96c9-dac502259ad0.png

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

67301486-469d-11ed-96c9-dac502259ad0.png

审核编辑:汤梓红

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

    关注

    134

    文章

    9073

    浏览量

    367228
  • 调试
    +关注

    关注

    7

    文章

    576

    浏览量

    33915
  • qemu
    +关注

    关注

    0

    文章

    57

    浏览量

    5345

原文标题:ARM深入理解-hypervisor调试方法二(QEMU+GDB调试ARM程序)

文章出处:【微信号:嵌入式ARM和Linux,微信公众号:嵌入式ARM和Linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    pyocd调试ARM芯片,Ubuntu 安装arm-none-eabi-gdb

    介绍如果在安装arm-none-eabi-gdb,在vscode下面对arm的单片机进行调试
    的头像 发表于 06-07 09:00 2.9w次阅读
    pyocd<b class='flag-5'>调试</b><b class='flag-5'>ARM</b>芯片,Ubuntu 安装<b class='flag-5'>arm-none-eabi-gdb</b>

    使用GDB调试Linux应用程序

    本篇讲解使用GDB调试Linux应用程序,以下以 `hellowld.c` 为例介绍 GDB调试入门。
    发表于 06-27 15:48 459次阅读

    RK3568-GDB程序调试方法说明

    RK3568-GDB程序调试方法说明
    的头像 发表于 01-19 16:16 1792次阅读
    RK3568-<b class='flag-5'>GDB</b><b class='flag-5'>程序</b><b class='flag-5'>调试</b>方法说明

    TLT507-GDB程序调试方法说明

    TLT507-GDB程序调试方法说明
    的头像 发表于 01-26 10:11 961次阅读
    TLT507-<b class='flag-5'>GDB</b><b class='flag-5'>程序</b><b class='flag-5'>调试</b>方法说明

    在Linux中如何使用gdb调试C程序

    通俗的讲,GDB 可以让你看到程序在执行过程时的内部流程,并帮你明确问题的所在。我们将在下一节通过一个有效的示例来讨论 GDB 调试器的用法,但在此之前,我们先来探讨一些之后对你有帮助
    发表于 04-28 15:37 1674次阅读

    如何在Linux中使用gdb调试C程序

    如果你是 C/C++ 程序员,或者使用 Fortran 和 Modula-2 编程语言开发软件,那么你将会很乐意知道有这么一款优秀的调试器 - GDB - 可以帮你更轻松地调试代码 b
    发表于 05-16 14:45 783次阅读
    如何在Linux中使用<b class='flag-5'>gdb</b><b class='flag-5'>调试</b>C<b class='flag-5'>程序</b>

    嵌入式Linux的GDB调试环境建立

    嵌入式Linux的GDB调试环境由Host和Target两部分组成,Host端使用arm-linux-gdb,Target Board端使用gdbserver。这样,应用程序
    发表于 04-02 14:33 516次阅读

    使用 GDB 调试多进程程序

    是 Proc1 的子进程,Proc3 又是 Proc2 的子进程。如何使用 GDB 调试 proc2 或者 proc3 呢?实际上,GDB 没有对多进程程序
    发表于 04-02 14:33 544次阅读

    Linux应用的GDB调试的原理及过程分析

    GDB调试是应用程序在开发板上运行,然后在PC机上对开发板上得应用程序进行调试,PC机运行GDB
    发表于 03-05 09:44 3409次阅读
    Linux应用的<b class='flag-5'>GDB</b><b class='flag-5'>调试</b>的原理及过程分析

    ARM平台如何玩转GDB远程调试

    前言关于GDB工具GDB工具是GNU项目调试器,基于命令行使用。和其他的调试器一样,可使用GDB工具单步运行
    的头像 发表于 09-28 18:17 969次阅读
    <b class='flag-5'>ARM</b>平台如何玩转<b class='flag-5'>GDB</b>远程<b class='flag-5'>调试</b>?

    在ubuntu中调试GDB

    的 gcc 编译器即可,注意需要加 -g 选项,才能使用 gdb 调试 arm-linux-gnueabihf-gcc gdbtest .c -o gdbtest -g //编译测试程序
    的头像 发表于 07-27 16:31 1048次阅读
    在ubuntu中<b class='flag-5'>调试</b><b class='flag-5'>GDB</b>

    qemu-riscv在scode的gdb调试步骤

    qemu支持gdb调试,只需要在命令中添加 -s -S两个参数即可,在bsp/qemu-riscv下已经有了qemu-dbg.sh,且加入了
    的头像 发表于 09-28 10:54 1498次阅读
    <b class='flag-5'>qemu</b>-riscv在scode的<b class='flag-5'>gdb</b><b class='flag-5'>调试</b>步骤

    GDB调试工具的原理

    一、GDB调试工具的原理 1.1 未执行进程调试 启用gdb调试运行gdb ./test的时候,
    的头像 发表于 11-09 17:04 919次阅读
    <b class='flag-5'>GDB</b><b class='flag-5'>调试</b>工具的原理

    如何使用GDB调试工具

    在对应程序目录中使用下面的命令 gdb test 2、调试已经开始运行的程序进程 调试已经开始运行的程序
    的头像 发表于 11-09 17:17 829次阅读
    如何使用<b class='flag-5'>GDB</b><b class='flag-5'>调试</b>工具

    如何使用linux下gdb调试python程序

    如何使用linux下gdb调试python程序  在Linux下,可以使用GDB(GNU调试器)来调试
    的头像 发表于 01-31 10:41 2529次阅读