这边使用bochs调试代码实在是太郁闷了. 今天我索性要将我所有bochs上遇到的调试问题说一下.想要用bochs调试(VT)代码一定要耐心, 不然就想杀人.

安装bochs的系统参考这个帖子 http://bbs.pediy.com/showthread.php?t=134693&highlight=bochs

首先看了这篇帖子(http://bbs.pediy.com/showthread.php?t=139031)说开启VT的办法. 然后我去下载了bochs 2.6 版本的代码.注意了是2.6版本的代码, bochs每个版本的代码编译都不一样. 最新的2.6.2编译就恶心多了.

bochs 2.6版本的代码编译非常简单, 直接将config.h

#define BX_SUPPORT_VMX 0

改成

#define BX_SUPPORT_VMX 2

到这里Cpu就已经支持VT了. 但是BIOS没有开启. 改这个

BX_CPU_THIS_PTR msr.ia32_feature_ctrl = /*BX_IA32_FEATURE_CONTROL_LOCK_BIT | */BX_IA32_FEATURE_CONTROL_VMX_ENABLE_BIT;

把注释去掉.

BX_CPU_THIS_PTR msr.ia32_feature_ctrl = BX_IA32_FEATURE_CONTROL_LOCK_BIT | BX_IA32_FEATURE_CONTROL_VMX_ENABLE_BIT;

完了之后, 编译处理就是开启VT的bochs了. 可以直接跑VT程序了. 我看整个网上的人抄来抄去也就是这么点内容了.我在想这些人是怎么进行VT代码调试的呢? windbg只能进入noroot模式. 进入root模式以后我的windbg直接就没响应了.所以要搞定调试, 需要这么几步, 首先要编译一个bochsdbg.exe出来. 在2.6版本的代码上将

#define BX_DEBUGGER 0 改成 #define BX_DEBUGGER 1

编译一堆错, 不应该啊, 网上文章什么的都说改了这个标记位就可以了啊. 报这个错.

#error “Handler-chaining-speedups are not supported together with internal debugger or gdb-stub!”

我靠. 不按套路出牌? 索性把这个定义改了.

#define BX_SUPPORT_HANDLERS_CHAINING_SPEEDUPS 1

改成

#define BX_SUPPORT_HANDLERS_CHAINING_SPEEDUPS 0

整个世界清静了. 代码成功编译出来, 搞个release版本的出来, 改名bochsdbg.exe覆盖2.6的那个bochsdbg.exe哈哈. 启动起来就断在第一行代码了. 兴奋不已. 装个windows. 这个网上有方法了. 完了之后开启magic_break断点. 在配置文件添加这么一行

magic_break: enabled=1

这样遇到xchg bx,bx指令的时候就会断下. 类似windbg的插入int 3断点, 但是问题来了. 你开启magic_break断点以后估计你永远也跑不到windows的界面. 因为中间有个地方有这个指令, 并且会循环的运行到. 我靠. 居然有这样的事情. 原来在写保护模式代码的时候就纠结过一次了. 不过那次反正也不进windows, 无所谓了. 但是现在不行啊.

百度 google.. 都没有遇到这个问题?? 你们都是怎么调试的?我就不信你们能够单步进windows. 那你们是下断点?bochs好像没有类似windbg .process cr3的功能. 也就是说没法在未知的情况下下线性地址断点. 下硬件断点断windows有点开玩笑. 比较好的做法还是xchg bx,bx断点啊, 可是现在windows有个循环就有这么条纠结的指令.

既然前面都改了bochs的源码, 那只能一条道走到黑了. 最后跟了下bochs的代码, 没有想象中的难嘛. 最后定位到这个函数

BX_INSF_TYPE BX_CPP_AttrRegparmN(1) BX_CPU_C::XCHG_EwGwR(bxInstruction_c *i){}

在这里就有一个判断opcode的地方.

// Note for mortals: the instruction to trigger this is “xchgw %bx,%bx” if (bx_dbg.magic_break_enabled && (i->src() == 3) && (i->dst() == 3))

哈哈. scr = 3, dst = 3那就是bx, bx了. 了解指令编码的人应该都很容易修改了. 我本来想一条非常偏门的指令的比如CMOVO. 但是为了简单. 我直接在将代码改成这样.

// // 这里我们改成 xchg sp,sp // if (bx_dbg.magic_break_enabled && (i->src() == 4) && (i->dst() == 4)) { BX_CPU_THIS_PTR magic_break = 1; BX_NEXT_INSTR(i); }

哈哈. 搞定. 直接进去windows都没有出声了. 加载个驱动. 里面加一行 xchg sp,sp马上断下来. 太牛逼了. 真是雪我十余年激愤.. 这下终于可以舒服的调试bochs的代码了.恩这边顺便把修改好的VS2008代码也上传下. 方便大家. 方便自己.

bochs-2.6-vs2008.rar

这代码是已经支持VT技术, BIOS也开启了VT. 同时magic_break 改成了 xchg sp,sp了. 最后YY一下, 如果可以改下bochs的代码, 给他加上微软的调试符号那就牛逼了. 当然只是YY. YY啊.