《软件调试》 99的页 有个分支到分支单步执行的例子, 我实验时却不成功,ZwSystemDebugControl 返回值为 -1073741822, 参考http://advdbg.org/forums/910/ShowPost.aspx 这篇帖子的内容, 在WIN7下需要MSR驱动, 我不会写驱动, 也不知道哪里下载, 所以就在XP下实验, 起初是在虚拟机下, ZwSystemDebugControl 返回为0 , 应该是失败了, 依旧没办法进行分支单步执行, 还是普通的单步执行。后来我直接安装了真实的XP系统, 安装了VS2005, 实验结果依然如故。 所以请教张老师和各位大侠, 问题到底出现在哪里。
我的CPU 型号是 I5-2450M。 双核4线程。
lkd> !cpuinfoCP F/M/S Manufacturer MHz PRCB Signature MSR 8B Signature Features 0 6,42,7 GenuineIntel 2494 0000002500000000 >0000002500000000<a0033fff 1 6,42,7 GenuineIntel 2494 0000002500000000 a0033fff 2 6,42,7 GenuineIntel 2494 0000002500000000 a0033fff 3 6,42,7 GenuineIntel 2494 0000002500000000 a0033fff
我的CPU 是 Core 系列的, 有个TM 的小上标, 在intel官网的手册上到对应的部分, 调试MSR 是 1D9H, BTF也是bit 1, 和代码中的是一致的, 应该是无需更改的。
是XP SP3吧?SP3默认也禁止了本地内核调试。要带内核调试启动,试试看
对了, 有个问题想请教一下ZwSystemDebugControl 函数返回多少才算成功? 我刚才试验成功了, 但是还是返回0, 最后ReadMSR()的时候 掉这个函数也还是返回 0.
刚才顺便把以前没法做的4M内存页试验也做了下, 现在是内核是大页面, 试验成功, 原版就是好呀, 以前碰到的问题统统都不见了。
m=1; if(1 > 2) { int a = 3; } else { int b = 4; } int c = 1;
m=2;
m=1;0042DAE2 mov dword ptr [ebp-14h],1 if(1 > 2)0042DAE9 xor eax,eax 0042DAEB je main+146h (42DAF6h) //--------------------b { int a = 3;0042DAED mov dword ptr ,3 } else0042DAF4 jmp main+14Dh (42DAFDh) { int b = 4;0042DAF6 mov dword ptr ,4 //----------------------------c } int c = 1;0042DAFD mov dword ptr ,1
m=2; 0042DB06 mov dword ptr [ebp-14h],2
不好意思,忘记这个贴了
仔细看了下,你说的非常对,是要真正发生跳转时才触发事件