用GDB远程调试运行于QEMU的程序

2023-11-03

1. 前言

限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。

2. 测试环境

本文使用 Ubuntu 16.04.4 LTS + QEMU 环境进行调试。

3. 用 GDB 调试 QEMU 内程序

3.1 编写用来调试的程序

我们用 ARM32 来进行调试,下面是用来测试的程序代码:

/* 
 * start.S 
 */

	.text

	.global _start
_start:
	mov r0, #8

1:
	b 1b

编译用的 Makefile

CROSS_COMPILE ?= arm-linux-gnueabi-

CC := ${CROSS_COMPILE}gcc
LD := ${CROSS_COMPILE}gcc

.PHONY: all clean

all: test.elf

test.elf: start.S
	$(CC) -nostdlib -g -o $@ $<

clean:
	-rm -fr test.elf

3.2 工具安装

3.2.1 安装 arm-linux-gnueabi-gcc

sudo apt-get install gcc-arm-linux-gnueabi

3.2.2 安装 gdb

sudo apt install gdb-multiarch

gdb-multiarch 支持多种目标架构,另外一种选择是交叉编译 ARM 平台的 gdb ,本篇不做展开。

3.2.3 安装 qemu

sudo apt-get install qemu

3.3 编译和调试

3.3.1 编译

start.SMakefile 放在同一目录下,然后运行:

make

将在目录下生成 test.elf 文件。

3.3.2 调试

我们调试程序,需要启动两个终端。第一个终端,QEMU 模拟 ARM 开发板 vexpress-a9 环境,用来运行程序 test.elf

sudo qemu-system-arm \
	 -M vexpress-a9 -m 512M \
	 -kernel test.elf -S -s -nographic

其中 -s 选项告诉 qemu-system-arm 启动内置的 gdb-server ,监听在 TCP 端口 1234 上;-S 选项告诉 qemu-system-arm 不要启动程序执行,等待 gdb 的指令。目前程序 test.elf 处于停止状态, qemu-system-arm 等待 gdb 客户端连接它,发送进一步的指令。现在用 gdb 连接 qemu-system-arm

$ gdb-multiarch test.elf
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1
Copyright (C) 2016 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.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from test.elf...done.
(gdb) target remote localhost:1234
Remote debugging using localhost:1234
_start () at start.S:5
5		mov r0, #8
(gdb) info registers
r0             0x0	0
r1             0x0	0
r2             0x0	0
r3             0x0	0
r4             0x0	0
r5             0x0	0
r6             0x0	0
r7             0x0	0
r8             0x0	0
r9             0x0	0
r10            0x0	0
r11            0x0	0
r12            0x0	0
sp             0x0	0x0
lr             0x0	0
pc             0x10098	0x10098 <_start>
cpsr           0x400001d3	1073742291
(gdb) 

现在我们可以用 gdb 来调试程序 test.elf 了。当前状况下,gdbqemu-system-arm 的关系可以用下图来描述:

 -------------------------
|      qemu-system-arm    |
|   -----------------     |        -----
|  | gdb-server:1234 |<---|-----> | gdb |
|   -----------------     |        -----
 -------------------------

4. 用 gdb 调试内核

# 启动内核,等待 gdb 的连接
sudo qemu-system-arm \
	 -s -S \
     -M vexpress-a9 -smp 4 -m 512M \
     -kernel zImage -dtb vexpress-v2p-ca9.dtb \
     -nographic \
     -append "root=/dev/mmcblk0 rw rootfstype=ext4 console=ttyAMA0" -sd rootfs.img
# 调试内核
gdb-multiarch vmlinux

Linux 内核调试的细节可参考博文:Linux: 内核启动代码调试

5. 参考资料

https://www.qemu.org/docs/master/system/gdb.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用GDB远程调试运行于QEMU的程序 的相关文章

  • 如何构建任务“gems:install”

    我正在将 Rails 应用程序部署到 Linux 服务器 并且缺少一些 rake 任务 包括 rake gems install 和 rake db 我正在运行来自 GEM 的 Rails 2 3 4 为什么是这样 我该如何解决 我可以以某
  • Urwid:使光标不可见

    我正在使用 urwid 它是一个用于在 ncurses 中设计终端用户界面的 Python 框架 但有一件事我在 urwid 中无法做到 而这在 Curses 中很容易做到 使光标不可见 现在 选择按钮时光标是可见的 而且看起来很丑 有办法
  • 如何查询X11显示分辨率?

    这似乎是一个简单的问题 但我找不到答案 如何查询 通过 X11 存在哪些监视器及其分辨率 查看显示宏 http tronche com gui x xlib display display macros html and 屏幕宏 http
  • 为什么C Clock()返回0

    我有这样的事情 clock t start end start clock something else end clock printf nClock cycles are d d n start end 我总是得到输出 时钟周期是 0
  • 为什么我可以在 /proc/pid/maps 输出中看到几个相同的段?

    测试在32位Linux上进行 代码如下 int foo int a int b int c a b return c int main int e 0 int d foo 1 2 printf d n d scanf d e return
  • Mcrt1.o和Scrt1.o有什么用?

    我坚持使用以下两个文件 即 Mcrt1 o 和 Scrt1 o 谁能帮我知道这两个文件的用途 如何使用它 我们以 gcrt1 o 为例 在使用 pg 选项编译进行性能测试时非常有用 谢谢 表格的文件 crt o总是 C 运行时启动代码 大部
  • 如何从 PROC 获取有关子进程的信息

    我正在尝试编写一个以几个进程作为参数的程序 然后父进程执行每个子进程并打印出一些相关的统计信息 示例 generate ls l 将生成一个程序 打印出有关 ls l 的一些统计信息 特别是其系统时间 用户时间和上下文切换次数 我不想使用
  • 无法在 64 位 Linux 上从汇编 (yasm) 代码调用 C 标准库函数

    我有一个函数foo以汇编语言编写 并在 Linux Ubuntu 64 位上使用 yasm 和 GCC 编译 它只是使用以下命令将消息打印到标准输出puts 如下所示 bits 64 extern puts global foo secti
  • 如何将后台作业的输出分配给 bash 变量?

    我想在 bash 中运行后台作业并将其结果分配给一个变量 我不喜欢使用临时文件 并且希望同时运行多个类似的后台任务 root root var echo hello world root root echo var hello world
  • 配置:错误:无法运行C编译的程序

    我正在尝试使用 Debian Wheezy 操作系统在我的 Raspberry Pi 上安装不同的软件 当我运行尝试配置软件时 我尝试安装我得到此输出 checking for C compiler default output file
  • C - 为什么我无法映射较小(256UL 或更小)的内存?

    请告诉我 为什么我的简单应用程序无法映射较小的内存 而且 为什么有这样一个特定的边界 257UL define MAP SIZE 256UL or below fail define MAP SIZE 257UL ok include
  • 这种 bash 文件名提取技术有何用途?

    我有一部分 bash 脚本正在获取不带扩展名的文件名 但我试图了解这里到底发生了什么 是做什么用的 有人可以详细说明 bash 在幕后做了什么吗 如何在一般基础上使用该技术 bin bash for src in tif do txt sr
  • 从 Python 访问 802.11 无线管理帧

    我想从 Linux 上的 Python 嗅探 802 11 管理 探测请求 帧 这可以从 Scapy 中实现 如下所示 coding utf 8 from scapy all import def proc p if p haslayer
  • 用于编辑 /etc/sudoers 文件的正则表达式模式

    我想删除 etc sudoers 文件中的 uncommnet 轮组 那么我应该使用什么正则表达式模式 cat etc sudoers Allows members of the sys group to run networking so
  • 如何在gnuplot中将字符串转换为数字

    有没有办法将表示数字 以科学格式 的字符串转换为 gnuplot 中的数字 IE stringnumber 1 0e0 number myconvert stringnumber plot 1 1 number 我可能使用 shell 命令
  • 错误:命令“c++”失败,退出状态为 1

    所以我尝试按照以下说明安装 Pyv8https andrewwilkinson wordpress com 2012 01 23 integrating python and javascript with pyv8 https andre
  • 在 Docker 容器中以主机用户身份运行

    在我的团队中 我们在进行开发时使用 Docker 容器在本地运行我们的网站应用程序 假设我正在开发 Flask 应用程序app py具有依赖关系requirements txt 工作流程大致如下 I am robin and I am in
  • 如何重命名 .tar.gz 文件而不提取内容并在 UBUNTU 中创建新的 .tar.gz 文件?

    我有一个命令将创建一个新的 tar gz现有文件中的文件 sudo tar zcvf Existing tar gz New tar gz 该命令将创建一个新的New tar gz从现有的文件Existing tar gz file 谁能告
  • XAMPP Windows 上的 Php Cron 作业

    嗯 我是这个词的新手CRON 据我所知 这是一个Unix安排特定操作在定义的时间间隔后执行的概念 我需要运行一个php文件 每小时更新一次数据库 但我的困惑在于安排执行 我在用XAMPP用于 Windows 7 上的本地开发测试 我发现了什
  • 在 debian wheezy amd64 上安装 ia32-libs

    我正在使用 Debian 7 喘息 amd64 uname a Linux tzwm debian 3 2 0 4 amd64 1 SMP Debian 3 2 51 1 x86 64 GNU Linux 我想安装ia32 libs在我的

随机推荐

  • 在colab上部署novelAI

    目录 一 获取模型 1 使用他人提供的模型链接直接在Google云端硬盘中添加快捷连接 推荐 2 自己上传模型到Google云端硬盘 二 colab上进行操作 第一步 加载Google云盘 第二步 克隆git仓库 第三步 安装依赖 第四步
  • Spring Boot 学习研究笔记(十七) -Spring boot JPA的复杂查询

    Spring boot JPA的复杂查询 一 JpaSpecificationExecutor 接口查询方式 1 JpaSpecificationExecutor接口 JPA 提供动态接口JpaSpecificationExecutor 利
  • JavaScript 算法 -- 贪心算法

    文章目录 贪心算法 例题一 分饼干 例题二 买卖股票的最佳时机 II 贪心算法 贪心算法是算法设计的一种方法 期盼通过每个阶段的局部最优选择 从而达到全局的最优 但最后的结果不一定最优 例题一 分饼干 param number g 胃口 p
  • 【机器学习算法】感知机模型

    文章目录 1 感知机模型 2 收敛性证明 Novikoff定理 3 感知机对偶形式 4 感知机的缺点 5 感知机的几个变形 5 1 投票感知机 5 2 平均感知机 1 感知机模型 感知机模型是一个二分类的模型 它通过形如 y w x
  • 前后端交互之解决跨域问题!!!!

    报错 XMLHttpRequest cannot load http 127 0 0 1 8080 detail all No Access Control Allow Origin header is present on the req
  • 小娜老师的讲义-Docker的管理工具们(Kubernetes)

    Kubernetes k8s 是自动化容器操作的开源平台 这些操作包括部署 调度和节点集群间扩展 如果你曾经用过Docker容器技术部署容器 那么可以将Docker看成Kubernetes内部使用的低级别组件 Kubernetes不仅仅支持
  • Python学习--函数与Lambda表达式

    链接 DataWhale函数与Lambda表达式 目录 1 函数 函数的定义 函数的调用 函数的返回值 函数文档及注解 函数参数 1 位置参数 2 默认参数 3 可变参数 4 关键字参数 5 命名关键字参数 6 参数组合 变量作用域 内嵌函
  • 一个能干掉90%候选人的Kafka面试连环炮!

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 目录 1 写在前面 2 如何保证宕机时数据不丢失 3 多副本冗余的高可用机制 4 多副本之间数据如何同步 5 ISR到底指的什么东西 6 acks参数的含义 7 最后
  • Less 18 (请求头注入--user-agent注入)

    文章目录 1 题目分析 2 构造SQL 3 手工注入 4 使用python进行注入 5 SQLmap注入 1 题目分析 首先我们来分析一下题目 经过尝试 我们知道 当我们输入正确的用户名和密码的时候 后台会将User Agent返回到屏幕上
  • 全国计算机等级考试题库二级C操作题100套(第89套)

    第89套 给定程序中 函数fun的功能是 求出形参ss所指字符串数组中最长字符串的 长度 其余字符串左边用字符 补齐 使其与最长的字符串等长 字符串数组中共 有M个字符串 且串长
  • 正点STM32F407核心板+ESP8266实现简单通信(详细讲解)

    1 ESP8266固件库的烧录 如果用串口助手连上板子 给8266发送AT指令发现老是报错error 可以重新烧录一下固件库 正点的ESP8266资料下载网址 http www openedv com thread 308397 1 1 h
  • tcp连接多久会自动断开_K8s 节点断开连接后,本在运行的 Pod 会如何?

    在工作节点与主节点断开连接后 工作节点上的 Pod 是什么状态 是否在继续运行 Kubernetes 控制器又在做什么 本文对此进行了实例研究 一一解答 作者 Bhargav Bhikkaji 翻译 Bach 才云 校对 星空下的文仔 才云
  • 微信小程序云开发之初体验(详细教程)

    微信小程序云开发之初体验 小程序云开发是微信最近推出的新的一项能力 它弱化了后端以及运维的概念 开发者无需搭建服务器 使用微信平台提供的api即可完成核心的业务开发 目前提供三大基础能力支持 云函数 在云端运行的代码 微信私有协议天然鉴权
  • 刷脸支付普及逐渐攀升产业生态逐渐形成

    刷脸让支付生态重返硬件年代 刷脸支付机具的生产 销售 铺设 维护涉及大量成本 客观存在压货风险大 后期服务难 地推成本高等问题 模式重而受益低 导致银行和大多数中小支付机构入局刷脸支付的意愿则整体薄弱得多 银联高调入局之际 2019 也是支
  • 《啊哈算法》学习——桶排序

    学习啊哈算法第一天 第一章第一节最快最简单的桶排序 问题描述 班级五名同学的分数排序 十分制 问题分析及思路 借助大小为10的一维数组 初始化为0 意味该分数没有人得 接下来处理分数 如有两个人得5分 即将a 5 2 记录下分数即出现次数后
  • Spring Validation 接口入参校验

    一 前言 JSR 是 Java Specification Requests 的缩写 含义为 JAVA 规范提案 JSR 303 Bean Validation 规范 正是一套基于 JavaBean 参数校验的标准 Hibernate Va
  • s3c2440移植ucGUI

    编译环境 ADS1 2 开发板 TQ2440 主要参考这篇文章 stm32 UCGUI 完美移植 ucGUI版本 3 90 ucGUI3 90下载地址 UCGUI最新3 90版源码 屏幕 联想VGA电脑屏幕 最大分辨率1024x768 1
  • vue如何编写自定义指令directive

    vue已经给我们内置了很多很好用的指令了 v mode v show 等等 但是有时候当这些指令不能满足我们需求的时候 我们还可以使用vue的自定义指令功能编写我们的指令 这是一个很强大的功能 需要说明的是 尽管自定义指令这个功能很强大 但
  • 3D MAX导出插件编写

    转 3D MAX导出插件编写 2011 6 9阅读1667 评论0 文章版权归博客园 BigCoder所有 转载请于明显位置标明原文作者及出处 以示尊重 原文出处 http www cnblogs com csyisong archive
  • 用GDB远程调试运行于QEMU的程序

    1 前言 限于作者能力水平 本文可能存在谬误 因此而给读者带来的损失 作者不做任何承诺 2 测试环境 本文使用 Ubuntu 16 04 4 LTS QEMU 环境进行调试 3 用 GDB 调试 QEMU 内程序 3 1 编写用来调试的程序