终于能够在GDB+qemu进行跟踪和调试了
2012-02-03 11:39
274 查看
经过几天努力,终于能够在GDB+qemu进行跟踪和调试了,但是现在只能调试ntoskrnl,还不知到,freeldr怎么跟踪调试
---------------------------------------------------------------------------------------------------------------------------------
快一年了,当重新用GDB+qemu进行跟踪和调试reactos时,居然遇到了几多问题,花了几天时间才把问题理顺,所以决定这一次把这些经验记录下来,方便以后查询,同时也谈谈怎么调试freeldr部分:
1. 准备调试版的reactos:
基于config.template.rbuild生成一份新的文档,命名config.rbuild,修改如下两个地方:
<property name="OPTIMIZE" value="0" /> //去掉优化
<property name="GDB" value="1" /> //启用GDB调试
然后再builder环境中:
make clean //清除所有的文件
make ROS_BUILDNOSTRIP=yes bootcd 生成带调试信息的reactos,
2. 启动qemu,注意要带上-s -S两个参数如:
qemu -L . -m 256 -hda d:/reactos.img -cdrom d:/reactos/reactos.iso -boot d -s -S
这时qemu启动时会等候gdb 客户端的连接
3。启动gdb
在gdb调试环境中先后执行:
gdb>directory . //这里有一个技巧,先把进入到reactos源码目录, 这时候设定目录就不用敲很长的字符了,只敲一个“.”即可
gdb>file output-i386/ntoskrnl/ntoskrnl.nostrip.exe //假设要调试ntoskrnl模块,可用file命令代入ntoskrnl符号文件
gdb>b *0x80801000 //在ntoskrnl模块入口设定断点
gdb>target remote localhost:1234 //连接gdb server
gdb>c //继续运行
这时候就看到程序停在boot.S 处:
这时候就可以执行任何调试命令,如l(list), ni(单步执行)
小插曲:qemu-0.12.3 版支持gdb 调试有问题,程序跟踪时其执行顺序是非预期的,我花了几天时间才找到问题缘由,曾一度怀疑是reactos编译环境有问题,幸喜找到去年编译的那一版,通过比较才把问题找到,qemu-0.12.5版经测试是ok的。
4。调试freeldr,
修改生成的makefile.auto, 查找freeldr_target,setupldr_target,在周围寻找
-@${rm} $(TEMPORARY)/setupldr.junk.tmp 2>$(NUL)
-@${rm} $(TEMPORARY)/freeldr.junk.tmp 2>$(NUL)
通过#,把这两行注释掉,然后分别执行:
make setupldr_clean
make setupldr
make freeldr_clean
make freeldr
这时在obj-i386(也即$(TEMPORARY))目录下能看到setupldr.junk.tmp ,freeldr.junk.tmp ,这两个文件可在gdb下直接装入:
gdb> file obj-i386/setupldr.junk.tmp
这样就可以跟踪调试reactos的启动部分代码了!
---------------------------------------------------------------------------------------------------------------------------------
快一年了,当重新用GDB+qemu进行跟踪和调试reactos时,居然遇到了几多问题,花了几天时间才把问题理顺,所以决定这一次把这些经验记录下来,方便以后查询,同时也谈谈怎么调试freeldr部分:
1. 准备调试版的reactos:
基于config.template.rbuild生成一份新的文档,命名config.rbuild,修改如下两个地方:
<property name="OPTIMIZE" value="0" /> //去掉优化
<property name="GDB" value="1" /> //启用GDB调试
然后再builder环境中:
make clean //清除所有的文件
make ROS_BUILDNOSTRIP=yes bootcd 生成带调试信息的reactos,
2. 启动qemu,注意要带上-s -S两个参数如:
qemu -L . -m 256 -hda d:/reactos.img -cdrom d:/reactos/reactos.iso -boot d -s -S
这时qemu启动时会等候gdb 客户端的连接
3。启动gdb
在gdb调试环境中先后执行:
gdb>directory . //这里有一个技巧,先把进入到reactos源码目录, 这时候设定目录就不用敲很长的字符了,只敲一个“.”即可
gdb>file output-i386/ntoskrnl/ntoskrnl.nostrip.exe //假设要调试ntoskrnl模块,可用file命令代入ntoskrnl符号文件
gdb>b *0x80801000 //在ntoskrnl模块入口设定断点
gdb>target remote localhost:1234 //连接gdb server
gdb>c //继续运行
这时候就看到程序停在boot.S 处:
这时候就可以执行任何调试命令,如l(list), ni(单步执行)
小插曲:qemu-0.12.3 版支持gdb 调试有问题,程序跟踪时其执行顺序是非预期的,我花了几天时间才找到问题缘由,曾一度怀疑是reactos编译环境有问题,幸喜找到去年编译的那一版,通过比较才把问题找到,qemu-0.12.5版经测试是ok的。
4。调试freeldr,
修改生成的makefile.auto, 查找freeldr_target,setupldr_target,在周围寻找
-@${rm} $(TEMPORARY)/setupldr.junk.tmp 2>$(NUL)
-@${rm} $(TEMPORARY)/freeldr.junk.tmp 2>$(NUL)
通过#,把这两行注释掉,然后分别执行:
make setupldr_clean
make setupldr
make freeldr_clean
make freeldr
这时在obj-i386(也即$(TEMPORARY))目录下能看到setupldr.junk.tmp ,freeldr.junk.tmp ,这两个文件可在gdb下直接装入:
gdb> file obj-i386/setupldr.junk.tmp
这样就可以跟踪调试reactos的启动部分代码了!
相关文章推荐
- 终于能够在GDB+qemu进行跟踪和调试了
- 用DDD+GDB+QEMU 进行linux内核源码级调试
- qemu进行ARM CPU仿真及程序gdb调试
- zz GDB概述(LINUX下的跟踪调试)
- Eclipse-cdt 配合 gdbserver 进行 arm 程序远程调试 上
- Ubuntu14.04下使用cuda-gdb进行调试
- qemu创建虚拟机,gdb调试及网络配置
- 手把手教你使用eclipse+qemu+gdb来单步调试ARM内核【学习笔记】
- 利用qemu进行内核源码级调试
- 利用GDB进行远程调试
- CMake生成的可执行文件能够gdb调试
- Linux下使用gdb进行单步调试(一)
- Openssl command到API转换--password和key、iv转化以及openssl进行gdb调试
- Android中使用arm-eabi-gdb和vim进行调试
- 使用 gdb 对程序进行汇编级调试
- gdb 跟踪调试命令整理
- GDB 进行调试 使用心得
- gdb qemu调试linux kernel并修改远程连接的bug
- GDB 进行调试 使用心得
- 用qemu与gdb调试linux kernel tcp/ip协议栈