代码调试是非常重要的,有时候开发的时间并不长,但是大部分时间都消耗在了调试代码上, 而且我们查找bug的时候,不懂得调试根本就是不可能的任务。下面介绍几种最基本的调试方法,虽然基本,但是绝对可以涵盖绝大部分的开发情况。再往高级的话,那可能就是windebug这样专业的调试工具了。当然,写这篇文章的原因,是我在之前查找这方面资料的时候,很多人的文章都是copy,而且方法都是打断点,这对工作中的开发简直就是废话。还有一种就是windebug。如果能介绍些实用的也就罢了。大篇幅的介绍windebug里面的命令,也没有什么实战的项目,没有真正有用的东西,所以,我把自己目前掌握的一点“公开的秘密”写出来,希望帮到大家。互联网的精神,就是共享啊!
**************************************************************************************
1>不用说,最常用的方法就是打断点,然后单步调试检查一下你的值是否正常,值正常说明前面运行是没有问题的,那就继续往下走,这样你的范围越来越小,能够精确定位事故处。打断点很方便,在代码的最前面点一下就有一个,再一下就消失了。下面是一些快捷命令,前三个是我常用的,后面的目前都没用过。
F5:调试状态运行程序,程序执行到有断点的地方会停下来
F10:单步执行程序
F11和F10:的区别是,如果当前执行语句是函数调用,则会进入函数里面
F9:在当前光标所在的行下断点,如果当前行已经有断点,则取消断点
Ctrl+Shift+F9:取消所有断点
CTRL+F10:运行到光标所在行
SHIFT+F11:跳出当前所在函数
到这里可能很多人就奇怪了,将这个似乎没啥用啊?这里我想说的是一个小技巧。就是VS编译器会对我们的代码进行优化,当你写好代码后编译后,调试的时候有时候会发现有些值不正常(理论上肯定是正常的),或者明明是走到这里,结果断点跑到了别的地方。这种情况是因为VS对代码进行了优化,比如你int a = 1;但是之后a这个值可能之后都没有使用,那么你调试的时候可能就走不到这个地方或者a的值显示异常。这对我们调试代码很不方便。所以,我们用断点调试的时候,如果发现不准确,就先关闭掉VS优化,等调试结束后,再恢复即可。关闭优化的地方在。右键工程属性->C/C++->Optimization,这里有两处,一处是Optimization选择Disabled,还有就是Favor
Size Or Speed选择Neither。这样再去调试代码就方便多了。
*********************************************************************************
2>考虑这样一种情况。你打包好一个程序给测试,然后出问题了。这时候你也不清楚问题出在哪里?如果让你在编译器里调试源代码,根本没有思路,这时候最好的方式当然是调试打包好的程序啊。这个时候可以用VS的Attach
to Process附到这个进程上,这有个前提,就是这个exe必须是你现在的代码编译出来而且没有修改过的,这样才能Attach成功,否则是无法捕获到的,原因是pdb不同,这个自行查资料。这个例子可以举的不是很好,因为我们完全可以再编译器里调试,例子有点牵强。好,现在看这样一个例子。如果你的程序用到了很多dll(自己工程编译出来的dll),然后你某个dll有问题,你只需要修改了这个dll,修改好以后,你想看下修改的是否正确。但是需要重新将整个程序打包出来,这个过程耗时而且繁琐,如果修改不正确就得继续来过。那有没有办法利用现在的程序调试呢?答案是有的,你可以将这个修改好的dll替换之前打包好的程序里的dll,这样运行这个程序,然后在该dll代码里的相应地方打上断点,Attach就可以进行调试了。这样省时省力。这个技术的运行的关键是,调试的程序或者dll必须和你工程里的是一致的,如果你在编译后修改过源代码,那就无法attch成功了。
*****************************************************************************************
3>现在在考虑上面的一种变异情况。如果你的某些操作很快,也就是等你利用VS的Attach
to Process附到这个进程上时,也许你想调试的功能早就过去了,或者进程都已经结束了。那么能不能在程序一运行的时候就能立刻Attach上去呢?其实方法还是很多的。对于VS的话,可以通过设置一个注册表键值,这个小技巧在《Windows核心编程》里就讲到过,在HKLM-software-microsoft-windows NT-currentversion-image file execution下新建一个项,项的名字就是你程序的名字,包含.exe,这个项里面新建一个REG_SZ类型,名字为debugger,键值是vsjitdebugger,也就是VS
just in time debugger的意思。这样,程序一运行的时候,就会弹出一个VS框提示你要附到哪个VS编译器上面。然后就可以愉快的调试代码了。刚才说有很多方式,当使用windebug调试的时候,也有类似的功能,原理都是差不多的。
*****************************************************************************************
4>当我们调试脚本的时候,似乎没什么方法去调试,只能通过脚本的信息输出来进行判断,其实方法还是有的。比如我们想调试脚本里调用某个dll的时候,我们必须要调用之前就Attach上去,不然就没办法调试了。怎么办呢?我们可以在脚本调用dll之前,写个弹出对话框的语句进去,这样执行到这里,程序就会停下来,这时候我们Attach上去,然后关闭掉对话框,就能愉快的调试代码了。
*****************************************************************************************
上面就是我目前掌握的一些调试技巧了,但是大部分代码通过这几步都是没问题的。如果你要调试的是一个没有源代码的程序,那就得用windebug这样强大的工具了,当然,我目前是不会的。以后有好的调试方式会继续放上来的。
版权声明:本文为博主原创文章,未经博主允许不得转载。