两年前调试usb/ip开源项目时,就曾用虚拟机远程调试过Windows和Linux系统内核,当时在VMware Workstation上创建两个虚拟机进行调试,也没有记录下如何配置调试,只是大体的还记得。好久没用GDB了,今天下载了QEMU源码,编译安装后想调试一下,前前后后花了大概一个小时才弄懂怎么调试QEMU,在此做个记录备忘。

个人认为用GDB调试QEMU时调试目标分为两种,一种是用GDB调试由QEMU启动的虚拟机,即远程调试虚拟机系统内核,可以从虚拟机的bootloader开始调试虚拟机启动过程,另一种是调试QEMU本身的代码而不是虚拟机要运行的代码。为了分析学习QEMU的源代码,我当然要进行后一种调试,但在这里我把两种调试的方法都说明一下:

1. 调试QEMU虚拟机内核:

镜像文件是test1.qcow2,上述命令行中,-S表示“freeze CPU at start up”,所以运行后你看不到任何输出。打开另一个console,运行gdb命令,如下图:

然后在GDB内部执行“target remote localhost:1234”,1234是默认的远程用于调试连接的端口号。然后执行命令“break *0x7c00”,这样就将一个断点设置在了bootloader被加载到的内存地址,接下来就任你玩了。

2. 调试QEMU源码:

用上述命令启动/usr/local/bin/qemu-system-x86_64,然后来到GDB命令行输入界面,如下图:

执行“break main”,和“break qemu_init_cpu_loop”,就在这两个函数的开始处分别设置了一个断点。然后执行“start”命令,看到运行到第一个断点处停了下来,执行“c”继续运行,又碰到了第二个断点,执行“bt”看一下调用栈,确实调用到了qemu_init_cpu_loop函数。如果想看源代码,执行“layout src”执行,就出现了如上图所示的源码窗口,接下来,随便你玩了。

GDB调试QEMU时经常遇到SIGUSR1与SIGUSR2后停下来,解决办法是执行命令:

(gdb) handle SIGUSR1 SIGUSR2 noprint nostop

转载于:https://www.cnblogs.com/woshiweige/p/4518431.html

QEMU+GDB调试方法相关推荐

  1. Qemu gdb 调试 Liteos realview-pbx-a9 工程

    目录 调试环境准备 gdb 调试方法 调试环境准备 实验操作系统:ubuntu 18.04.5.准备如下环境: 下载 huawei liteos, 并按照官方文档.编译 realview-pbx-a9 ...

  2. linux下gdb调试方法和技巧详解

    linux下gdb调试方法和技巧整理 简介 UNIX或者UNIX-like下调试工具 启动gdb # 1. 在可执行程序不需要输入参数时,我们可以使用 gdb + 可执行程序 gdb ./typeid ...

  3. qemu+gdb调试内核

    我们在内核调试的时候,会有很多方法,比如printk, ftrace, kprobe, ebpf和gdb等.比起其他的方法,gdb可以单步运行代码,实时获取变量信息等优势.但劣势也比较明显,比如效率较 ...

  4. linux core文件GDB调试方法

    一.如何使用core文件 1. 使用core文件 在core文件所在目录下键入: gdb -c coreXXX 它会启动GNU的调试器,来调试core文件,并且会显示生成此core文件的程序名,中止此 ...

  5. qemu+gdb调试linux内核

    文章目录 编译内核 下载qemu 构建initramfs根文件系统 1.编译Busybox 2.生成initrd 3.测试根文件系统 gdb调试内核 参考文献 编译内核 # make menuconf ...

  6. 黑马程序员Linux系统开发视频之gdb调试方法

    一.gdb -- 命令     1.前提条件:可执行文件必须包含调试信息 gcc -gcc     2.gdb 文件名 -- 启动gdb调试     3.查看代码的命令         当前文件:   ...

  7. go语言的gdb调试方法

    1.加载go语言的gdb调试支持文件 source go/src/runtime/runtime-gdb.py 或者 设置为自动加载. 加载成功后gdb显示:Loading Go Runtime su ...

  8. linux下gdb调试方法与技巧整理

    目录 一.gdb简介 二.gdb使用流程 1.启动gdb 2.查看源码 3.运行程序 4.设置断点 5.单步执行 6.查看变量 7.退出gdb 三.gdb基本使用命令 1.运行命令 2.设置断点 3. ...

  9. LINUX下的gdb调试方法

    首先对目标文件进行编译 例如: gcc test.c -o test 这时会生成一个文件test,然后我们就可以对test进行调试了 示例: gdb test 好了以后是设定断点 示例: break ...

最新文章

  1. 剑指offer 算法 (位运算)
  2. 基于内容的图像检索CBIR部分数据库和源代码资料
  3. 五十、微信小程序云开发中的云数据库
  4. 什么是Kubernetes的CRI - 容器运行时接口
  5. 世界上迄今为止最安全的加密算法
  6. sliverlight 开发FAQ
  7. maple 2018 窗口关闭提示乱码_如果解决SOLIDWORKS工程图转CAD字体出现乱码的问题_SolidWorks生信科技...
  8. 手机端html使用地理定位,html5之使用地理定位
  9. Java 根据枚举的名字得到枚举的实例
  10. delphi2010:按键 控制键 组合键的判断 响应
  11. ATTILAX项目进展表VC425
  12. html中表格居中对齐
  13. ffmpeg解复用FLV文件
  14. python输出语句print格式_print输出语句的格式是什么?
  15. html实现鼠标悬停效果实现
  16. 用python3实现HDU爬虫(后续可能更新VJ)2016.11.4更新
  17. 菜鸟说有线网络连接故障
  18. php超大数组插入数据库处理
  19. 现代控制工程-状态空间(正在更新)
  20. Android 从6.0,7.0,8.0,9.0,10.0的特性整理和适配方案(不好含全部新特性,总结了一些可能应用中会遇到的)

热门文章

  1. 聚集索引,非聚集索引的区别是什么
  2. Spring-Data-Redis存储对象(redisTemplate)
  3. c#里面的combobox在代码中怎么根据它的text获取它的index?
  4. pack unpack 用法 转载
  5. [译] Vue: scoped 样式与 CSS Module 对比
  6. Nagios 监控 SNMP 温度计
  7. 45个非常有用的Oracle查询语句(转自开源中国社区)
  8. Java基础知识编写一个HelloWorld案例
  9. sqoop 把 hdfs 和关系型数据库 (mysql等)互导
  10. shell中shift作用