博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
QEMU+GDB调试方法
阅读量:4678 次
发布时间:2019-06-09

本文共 986 字,大约阅读时间需要 3 分钟。

两年前调试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

你可能感兴趣的文章
Swift,下标简化方法的调用
查看>>
pal2nal
查看>>
HihoCoder - 1236 Scores (五维偏序,分块+bitset)
查看>>
Jquery 事件 DOM操作
查看>>
运算符
查看>>
FIR滤波器的verilog实现方法
查看>>
display的值和对应的意义
查看>>
HashSet、LinkHashSet、TreeSet总结
查看>>
手机号码输入格式化,数字三三四的输入;手机正则校验输入是否合理及提示;...
查看>>
抽象类
查看>>
CSS3 背景
查看>>
WPF DataGrid 之数据绑定
查看>>
c语言之gdb调试。
查看>>
位反转的最佳算法
查看>>
常用面试问题
查看>>
第一个爬虫
查看>>
Java面试知识点之Java基础
查看>>
老外的前端面试题
查看>>
架构:新浪架构师谈微博架构
查看>>
SQL 语句速查
查看>>