采用eclipse + gdb来搭建调试qemu源码的环境

本文介绍了一种通过Eclipse+GDB搭建QEMU源码调试环境的方法,并给出了配置建议及Makefile文件分析,帮助读者更好地理解QEMU的编译过程。
 由于很多同学来信询问如何学习qemu,要看哪些资料,应该怎么入手之类的问题,我每次都回答:看代码。但是qemu的代码也是挺庞大的,如果没有一个好的方法和环境,将是一件非常痛苦的事情。因为qemu的相关资料太少了,并不像linux,有很多源码分析的资料可以对照的看。
    对一个陌生的东西,最好的方法是跟踪它,所以,我们可以通过单步调试的方法来分析qemu的代码,下面就介绍一下如何通过eclipse+gdb来搭建qemu源码的调试环境。
    在真正开始之前,先给个分析qemu源码的小建议(纯个人经验),注意:同样适用于分析linux代码。
     先学习linux使用相关的知识,推荐书籍《鸟哥的linux私房菜》,其次学习linux环境编程,推荐书籍《Unix环境高级编程》,最后学习qemu/linux源码分析,推荐书籍《深入理解linux内核》。
1. qemu源码编译
(1)configure配置选项,根据不同的体系结构和需求进行配置,我的配置如下:
  1. ./configure --target-list=i386-softmmu,i386-linux-user --disable-xen --disable-vnc --disable-vnc-png --disable-vnc-jpeg --disable-vnc-sasl --disable-vnc-tls --disable-blobs --disable-bluez --disable-bsd-user --disable-darwin-user --disable-user --disable-vnc-thread
(2)eclipse 项目配置
   在eclipse中创建Makefile工程,将configure后的源码拷贝到新建工程中,执行Build,然后就想调试helloworld一样对qemu进行调试了。
2. qemu的Makefile文件分析
  1. /*Makefile*/
  2. all: build-all
  3. include config-host.mak
  4. include $(SRC_PATH)/rules.mak
  5. config-host.mak:$(SRC_PATH)/configure
  6. @echo $@ is out-of-date, running configure
  7. @sed –n “/.*Configured with/s/[^:]*: //p” $@ | sh
  8. /*config-host.mak*/
  9. SRC_PATH = /home/workspace/qemu-1.0
  10. CFLAGS=-O2 –g ? CFLAGS=O0 –g /*避免调试时指令乱序执行*/
  11. %.o:%./*Makefile中的模式匹配,将所有的.c文件生成对应的.o*/
  12. $(call quiet-command,$(CC) $(QEMU_INCLUDES) $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) –c –o $@ $<,”CC $(TARGET_DIR)$@)
  13. /*上面规则的含义即为调用函数quiet-command, 并且函数有两个参数:
  14. * $1 = (CC) $(QEMU_INCLUDES) $(QEMU_CFLAGS) $(QEMU_DGFLAGS) *$(CFLAGS) –c –o $@ $<
  15.  * $2 = ”CC $(TARGET_DIR)$@
  16. */
  17. quiet-command = $(if $(V), $1,$(if $(2), echo $2 &&$1, @$1))
  18. /*这条规则的含义为,如果$(V) !=NULL,则执行参数1($1), 否则,如果$(2)!=NULL,则先打印出$2,再执行$1*/

  19. %.o:%./*原理同上*/

  20. /*经过以上两步之后,已经把所有的.c和.S生成了对应的.o文件*/
  21. LINK = $(call quiet-command,$(CC) $(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ $(1) $(LIBS)," LINK $(TARGET_DIR)$@")
  22. /*上面规则的含义为: gcc –o qemu-system-i386 *.*/
   从Makefile可以得到如下信息:
          Qemu支持系统仿真和用户仿真两种模式,可以简单的作如下理解:

1)系统仿真,仿真一台完整的pc机,包括cpu,总线,内存,硬盘,外设等,调用i386-softmmu/qemu-system-i386。系统仿真模式包括的所有文件,参见附录A 从附录A中可以很清晰的知道系统仿真模式由哪些文件编译生成(configure时的配置不同,略有差异),依赖了哪些库(蓝色加粗)等。

2)用户仿真,仅仅仿真cpu,调用i386-linux-user/qemu-i386命令。用户仿真模式包括的所有文件,参见附录B,可以很清楚的知道用户仿真模式的命令qemu-i386由哪些文件编译生成configure时的配置不同,略有差异),依赖了哪些库(蓝色加粗),需要哪个链接脚本文件等等。

<think>好的,我现在需要解决用户在Ubuntu上配置GDB进行单步调试时遇到的报错问题。首先,我要回忆一下用户提供的引用内容,看看有没有相关的解决方案。 用户提到了几个引用,其中引用[2]提到在单步调试时遇到无法打开"clock.c"的错误,解决方案是创建对应的目录并下载glibc源码。这可能是一个常见的问题,因为GDB调试时会尝试查找源码路径,如果系统中没有安装相应的调试符号或源码,就会报错。所以,用户的问题可能与缺失调试符号或源码有关。 接下来,引用[4]讨论了在VScode中配置GDB绕过标准库文件的方法,使用了skip命令来避免进入标准库函数。这可能说明用户在使用GDB时遇到了进入标准库的问题,但用户的具体报错可能不同,需要进一步分析。 用户的问题是关于Ubuntu上GDB单步调试的报错,可能的具体错误可能包括找不到源码文件、缺少调试信息或权限问题。根据引用[2]的情况,首先应该检查是否安装了必要的调试符号包,比如glibc的调试符号,可以通过安装glibc-dbg或相关的-dbg包来解决。 另外,用户可能没有在编译程序时加上-g选项,导致GDB无法获取调试信息。这时候需要确保编译命令中包含-g参数,例如gcc -g -o program program.c。 还有可能遇到的是权限问题,比如调试的程序需要root权限,而用户没有正确使用sudo。或者,程序的路径中包含特殊字符,导致GDB无法正确解析路径。 此外,引用[3]提到使用qemueclipse调试内核,这可能涉及到更复杂的调试环境配置,但用户的问题可能更基础,比如普通应用程序的调试。 需要综合考虑这些可能性,逐步给出解决方案。首先建议用户安装调试符号,检查编译选项,然后处理可能的路径或权限问题。如果报错与找不到特定源码文件相关,比如类似引用[2]中的clock.c,则需要按照引用中的方法创建目录并下载对应版本的glibc源码。 最后,可能需要配置GDB源码路径,使用dir命令指定源码位置,或者在GDB配置文件中设置替代路径,确保GDB能找到相应的源码文件。 总结步骤应该是:安装调试符号,确保编译带调试信息,处理源码路径问题,检查权限,以及必要时配置GDB源码搜索路径。同时,根据不同的具体错误信息,给出对应的解决方案。</think>在Ubuntu上配置GDB进行单步调试时,常见错误及解决方案如下: --- ### **1. 缺少调试符号导致的源码无法访问** **错误示例**: `无法打开"clock.c":无法读取文件 (Error:找不到文件/build/glibc-XXXX/glibc-2.XX/...)` **原因**:GDB需要源码文件路径匹配调试符号中的记录,但系统中未安装源码调试符号包。 **解决方案**: 1. **安装glibc调试符号**: ```bash sudo apt-get install glibc-source # 安装glibc源码 sudo apt-get install glibc-dbg # 安装调试符号 ``` 2. **手动创建源码路径**(针对特定版本): ```bash sudo mkdir -p /build/glibc-XXXX # 替换XXXX为报错中的具体版本号 cd /build/glibc-XXXX sudo wget http://ftp.gnu.org/gnu/glibc/glibc-2.XX.tar.gz # 下载对应版本源码 sudo tar -zxvf glibc-2.XX.tar.gz ``` 3. **在GDB中手动指定源码路径**: ```bash (gdb) dir /path/to/glibc/source # 指定源码目录 ``` --- ### **2. 编译时未启用调试信息** **错误现象**:单步调试时无法查看变量或源码行号。 **解决方案**: 在编译程序时添加 `-g` 选项以生成调试信息: ```bash gcc -g -o my_program my_program.c # C语言 g++ -g -o my_program my_program.cpp # C++ ``` --- ### **3. 权限问题** **错误现象**: - `Cannot access memory at address 0x...` - 调试进程时因权限不足被拒绝 **解决方案**: 1. 使用 `sudo` 运行GDB(需谨慎): ```bash sudo gdb my_program ``` 2. 永久启用普通用户调试权限: ```bash echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope ``` --- ### **4. 跳过标准库函数单步** **需求**:避免进入C/C++标准库函数(如`std::vector`或`printf`)。 **方法**(GDB 7.3+): ```bash (gdb) skip -rfu ^std::.* # 跳过所有std命名空间的函数 (gdb) skip -rfu boost::.* # 跳过Boost库函数(可选) ``` 或通过配置文件 `~/.gdbinit` 持久化配置[^4]。 --- ### **5. 内核调试相关错误** **场景**:调试Linux内核模块时出现地址错误。 **解决方案**: 需使用内核调试专用工具链(如QEMU + GDB),参考配置方法[^3]。 --- ### **总结步骤** 1. **安装调试符号**:确保目标程序及其依赖库的调试符号已安装。 2. **编译时添加 `-g`**:生成完整的调试信息。 3. **处理源码路径**:手动下载缺失源码或配置GDB路径。 4. **调整权限**:按需使用 `sudo` 或修改系统安全策略。 5. **优化调试体验**:使用 `skip` 命令过滤无关函数[^4]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值