本篇要说的调试原理以及3种断点的设置
不懂调试不能说你懂了编程,不会设置断点就说明你不懂,一个程序只有不断地DEBUG才能达到它所能达到得完美,正像一个人必须得禁得起无数人,无数失败的DEBUG才能走向它的成熟。人是通过无数次失败和无数人指正他的失误和缺点来DEBUG,那一个可能有很多BUG漏洞的程序是通过怎样的方式来把BUG
DElETE掉的呢?
会用VC的人都知道,当你拿到一个程序,按F5运行发现运行的结果与你想得到的结果不同的时候,你就会按F11或者F10进入单步调试模式,或者在你认为可能出现了错误的那一行按F9设置一个断点,在离它不远的地方再设一个断点,按F5运行,程序就会在它运行的地方停止,你通过按F11或者F10进行单步运行,观察下面的表里面的变量情况就可以推算出哪行大概出错,然后修改程序,至于单步调试F11和F10的区别你多试试就知道了,如果对于源代码调试还找不到错误的话,那就按ALT
8进入反汇编区,继续单步调试,找出BUG。
以上就是你拿着C的源代码进行调试的过程,但是你如果没有源代码怎么调试了?或者VC是怎么进行调试的呢,怎么设置断点的呢?OD的基本思路又是怎么写成的呢?
这里介绍一种断点设置断点的方法,大家可以通过C编程实现:
Int
3断点,或者说中断断点:
大家可以试一试用VC写这样一个程序
int main(int arg,char * agrv[])
{
__asm int 3
return 0;
}
看看有什么效果,或者把__asm int
3加入到你写的某个程序的某行,按F5运行,看看有什么反应,可以告诉大家这个程序运行到__asm int
3这行停了下来(有的版本可能报错),这个就跟你在这行按F9一样,注意一点:这个asm前面是两个__而不是一个_!!!
这个指令是表示在你的程序里加入汇编码的意思,你可以__asm{}在这个括号里加入汇编码,这个int
3就是汇编里面的断点,它对应的机器码是十六进制的CC,你可以用C32asm的十六进制模式下打开一个应用程序,在它的代码区把某个数据改成CC,这样你就可以在这个应用程序里设置一个断点,保存然后运行就会发现,程序运行到某个部分终止,就是你改成CC的位置,你可以通过编程,先记下某个程序某位置的数据,然后把它改成CC,在你编的程序里调用运行你要调试的程序,它就会运行到你修改的位置终止,然后你通过你编程的记录这个调试程序在这个断点处的信息。
记下以后,把CC又修改为原来的值,这样就实现了调试,这就是OD,VC调试实现的基本原理,设置断点,读取断点处程序的信息,记住C里面的__asm
int
3命令,或者CC这个十六进制机器指令,把它们经常写在你的程序里会很有试试,特别是记住CC这个机器码,是不是很好记啊,慢慢积少成多,或许有一天你也能拿这些机器码,直接用记事本写程序了。