zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    request对象
    js基础3
    Andorid Binder进程间通信---总结
    java 获取系统变量(环境变量和设置变量)
    參加项目管理培训的一些体会
    select poll使用
    关注关注工作行列
    jquery——zTree, 完美好用的树插件
    OSI七层模型具体解释
    (原创)优酷androidclient 下载中 bug 解决
  • 原文地址:https://www.cnblogs.com/woshiweige/p/4518431.html
Copyright © 2011-2022 走看看