返回介绍

2.QEMU调试

发布于 2021-05-01 04:38:17 字数 4940 浏览 1175 评论 0 收藏 0

提示

视频 PPT 下载

本文的目的和背景

VS Code(全称 Visual Studio Code)是一个轻量且强大的代码编辑器,支持 Windows,OS X 和 Linux。内置 JavaScript、TypeScript 和 Node.js 支持,而且拥有丰富的插件生态系统,可通过安装插件来支持 C++、C#、Python、PHP 等其他语言。

本文主要介绍在 Windows 平台使用 VS Code 调试 qemu-vexpress-a9 BSP 工程。

准备工作

运行和调试 RT-Thread

步骤一 打开 VS Code 项目工程

在 Env 控制台进入 qemu-vexpress-a9 BSP 根目录,然后输入命令 code . (注意:code 后面有一个点)打开 VS Code,表示使用 VS Code 打开当前目录。

注意事项

code 是命令,点 '.' 是参数表示当前目录,中间由空格隔开

打开 Env 控制台

VS Code 打开后会自动打开 qemu-vexpress-a9 BSP 文件夹,如下图所示。

打开 VS Code

步骤二 安装调试插件

在 VS Code Extensions 里下载并安装支持 C/C++ 的调试插件:

安装 c/c++ 插件

安装好后确认插件为以下状态,如果不是则点击重新加载:

c/c++ 插件状态

步骤三 编译 RT-Thread

点击 VS Code “查看 -> 终端” 打开 VS Code 内部终端,在终端里输入命令 scons 即可编译工程,终端会打印出编译信息。

编译工程

编译完成后输入 .\qemu.bat 命令就可以运行工程。终端会输出 RT-Thread 启动 logo 信息,QEMU 也运行了起来。

运行工程

注意事项

  1. 调试 BSP 工程前需要先编译工程生成 rtthread.elf 文件。
  2. 可以使用 scons --target=vsc -s 命令更新 VS Code 需要用到的 C/C++ 头文件搜索路径信息。不是每次都需要更新,只有在使用了 menuconfig 重新配置了 RT-Thread 或更改了 rtconfig.h 头文件时才需要。

步骤四 修改 qemu-dbg.bat 文件

开始调试前需要编辑 qemu-vexpress-a9 目录下的 qemu-dbg.bat 文件,在 qemu-system-arm 前加入 start :

@echo off
if exist sd.bin goto run
qemu-img create -f raw sd.bin 64M

:run
start qemu-system-arm -M vexpress-a9 -kernel rtthread.elf -serial stdio -sd sd.bin -S -s

步骤五 调试工程

如下图所示,在 VS Code 里点击调试菜单(小虫子图标),调试平台选择 Windows,然后按 F5 就可以开启 QEMU 调试模式,断点停留在 main 函数。VS Code 调试选项如下图所示:

Env 调试界面

QEMU 也运行了起来,如下图所示。

qemu 调试界面

在 VS Code 里可以使用 GDB 命令,需要在最前面加上 -exec。 例如 -exec info registers 命令可以查看寄存器的内容:

gdb 查看内存

其他一些主要命令介绍如下所示:

查看内存地址内容:x/<n/f/u> <addr>,各个参数说明如下所示:

  • n 是一个正整数,表示需要显示的内存单元的个数,也就是说从当前地址向后显示几个内存单元的内容,一个内存单元的大小由后面的 u 定义
  • f 表示显示的格式,参见下面。如果地址所指的是字符串,那么格式可以是 s。其他格式如下表所示:
参数描述
x按十六进制格式显示变量
d按十进制格式显示变量
u按十六进制格式显示无符号整型
o按八进制格式显示变量
t按二进制格式显示变量
a按十六进制格式显示变量
c按字符格式显示变量
f按浮点数格式显示变量
  • u 表示从当前地址往后请求的字节数,如果不指定的话,GDB 默认是 4 个 bytes。u 参数可以用下面的字符来代替,b 表示单字节,h 表示双字节,w 表示四字 节,g 表示八字节。当我们指定了字节长度后,GDB 会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。
  • addr 表示一个内存地址。

注意事项

严格区分 n 和 u 的关系,n 表示单元个数,u 表示每个单元的大小。

示例: x/3uh 0x54320 表示从内存地址 0x54320 读取内容,h 表示以双字节为一个单位,3 表示输出三个单位,u 表示按十六进制显示。

查看当前程序栈的内容: x/10x $sp--> 打印 stack 的前 10 个元素 查看当前程序栈的信息: info frame----list general info about the frame 查看当前程序栈的参数: info args---lists arguments to the function 查看当前程序栈的局部变量: info locals---list variables stored in the frame 查看当前寄存器的值:info registers(不包括浮点寄存器) info all-registers(包括浮点寄存器) 查看当前栈帧中的异常处理器:info catch(exception handlers)

提示

输入命令时可以只输入每个命令的第一个字母。例如:info registers 可以只输入 i r

注意事项

  • 如果在 VS Code 目录中额外添加了文件夹,会导致调试不能够启动。
  • 每次开始调试都需要使用 Env 工具在 BSP 根目录使用code .命令打开 VS Code 才能正常调试工程。

参考资料

常见问题

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文