QEMU+GDB调试方法
两年前调试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
QEMU+GDB调试方法的更多相关文章
- ubuntu: qemu+gdb 调试linux kernel 学习笔记
声明: 本笔记内容并非本人原创,90%来自网络资料的整合.同时,由于自己是刚刚接触qemu & gdbserver remote debug,本文也就算不得教程,仅供有缘人参考而已. ---- ...
- NOI Linux下Emacs && gdb调试方法
1. 首先要配置emacs文件: (global-linum-mode t) (show-paren-mode t) (global-set-key (kbd "C-s") 'sa ...
- GDB调试方法精粹
http://blog.chinaunix.net/uid-26922071-id-3756018.html 一.多线程调试 1. 多线程调试,最重要的几个命令: info threads ...
- GDB调试方法(转)
一:列文件清单 1. List (gdb) list line1,line2 ************************************************************* ...
- LINUX下的gdb调试方法
首先对目标文件进行编译 例如: gcc test.c -o test 这时会生成一个文件test,然后我们就可以对test进行调试了 示例: gdb test 好了以后是设定断点 示例: break ...
- gdb调试方法
先打开 gdb 的调试选项: -g 串口端: ./gdb-server 10.12.2.100:12345 ./Kylin 服务器端: (1)./gdb ./Kylin (2) targ ...
- php 502 无错误行和报错文件的情况下使用gdb调试方法
lnmp环境 gdb /usr/local/php5.2/bin/php-cgi /tmp/coredump-php-cgi.20503 source /home/tmp/lnmp1.4-full ...
- linux下gdb调试方法与技巧整理
参考博客: https://blog.csdn.net/niyaozuozuihao/article/details/91802994 1.运行命令run:简记为 r ,其作用是运行程序,当遇到断点 ...
- GCC + GDB 调试方法
首先编译程序 多加一个 -g c++ test.cpp -o a -Wall -g 执行时使用 gdb a 此时输入 l 显示所有的代码 l 输入b 加入断点到某一行(break) b 108 运行 ...
随机推荐
- git (unable to update local ref )
https://stackoverflow.com/questions/2998832/git-pull-fails-unable-to-resolve-reference-unable-to-upd ...
- 分离焦虑OR责任焦虑
这里是用小孩上幼儿园的事说分离焦虑,转念到成人身上就是责任焦虑. 这周小孩开始上幼儿园了,他很害怕家长离开,我能做的也不多,只是很肯定的告诉他,爸爸就在停车场,下学就来接你,然后从各个 ...
- Matplotlib绘图属性(1)
[matplotlib颜色.形状.线型等详细配置方法] #1.颜色(三种方法)-color 八种内置颜色及其缩写: b:blue <蓝色> c:cyan <青色> g:gree ...
- intellij idea 17 log4j 中文乱码
先是在intellij idea里设置没有得到解决, 然后在tomcat的server.xml里设置没有得到解决, 再然后在log4j配置文件里配置没有得到解决. 以下是解决方案. C:\Progra ...
- Charlie's Change(完全背包记录路径)
Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie drives a lot and so he often buys coffe ...
- SPOJ-Matrices with XOR property,暴力打表!
Matrices with XOR property 应该先去看看这题的,补题的时候发现这题其实挺简单的.. 题意:n*m的格子用1-n*m的数去填,要求如果一个格子(i1,j1)与另外一个格子(i2 ...
- EasyUI 动态更新列
function UpdateRow() { var rows = $('#tbpmgridList').datagrid('getChecked'); var productid = ''; for ...
- ES6 Arrow Function & this bug
ES6 Arrow Function & this bug let accHeadings = document.querySelectorAll(`.accordionItemHeading ...
- mybatis学习(一)——mybatis简介
1.简介 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBati ...
- Spoj-DWARFLOG Manipulate Dwarfs
Manipulate Dwarfs In a small village beyond seven hills and seven seas, Snow White lives together wi ...