机房收费系统之问题记录(2)

来源:互联网 发布:软件看门狗程序 编辑:程序博客网 时间:2024/05/16 07:59

【背景】

        在被师傅验机房的时候,发现每次出错,师傅都会设置一个断点进行调试,然后寻找问题的所在,对于断点调试以前只有一个模糊的认识,在刚学VB的时候,以前的师傅就给提示过,但是当时只是知道能够用来进行调错,但是不知道具体怎么使用,又有什么作用?所以也没有经常性的使用,到了后面接触的代码越多,对于断点调试接触的次数越多,也就想要知道他究竟是什么?怎么用?

【情节】

       在看师傅和小伙伴们帮忙调试的时候,发现了一个它的基础作用,就是对于查询或者是代码的“翻译”作用,能够让你充分的明白,这句话到底表达了什么意思,你的错误又出现在了什么地方。

       接下来看一下图片展示:

       

        看完图后我想各位对于我所说的“翻译”应该能够有所理解了。
        接下来就是对于断点调试的基本介绍:
        断点是一个信号,它通知调试器,在某个特定点上暂时将程序执行挂起。当执行在某个断点处挂起时,我们称程序处于中断模式。进入中断模式并不会终止或结束程序的执行。执行可以在任何时候继续。
       CPU有一个单独的执行序列,会一条指令一条指令的顺序执行。要处理类似IO或者硬件时钟这样的异步事件时CPU就要用到中断。硬件中断通常是一个专门的电信号,连接到一个特殊的“响应电路”上。这个电路会感知中断的到来,然后会使CPU停止当前的执行流,保存当前的状态,然后跳转到一个预定义的地址处去执行,这个地址上会有一个中断处理例程。当中断处理例程完成它的工作后,CPU就从之前停止的地方恢复执行。
       断点模式可以看作一种超时。所有元素(例如,函数、变量和对象)都保留在内存中,但它们的移动和活动被挂起了。在中断模式下,您可以检查它们的位置和状态,以查看是否存在冲突或 bug。您可以在中断模式下对程序进行调整。例如,可以更改变量的值。可以移动执行点,这会改变执行恢复后将要执行的下一条语句。在 C++、C# 和 Visual Basic 中,甚至可以在中断模式下对代码本身进行更改。
        常用的断点包括:INT3断点、硬件断点、内存断点、消息断点、条件断点等。
        看完断点的简介之后,有没有想知道这几种常用的断点的强大作用呢?让我们一起来看看INT3断点、条件断点还有监视断点吧!
       INT3断点:
       INT 是Intel系列CPU的一个指令,可以让程序产生一个中断或者异常。程序中如果有中断或者异常发生了以后,CPU会中断程序的执行,去一个叫做IDT的部件查找处理这个中断(或者异常)的例程(Handler)。
        INT 3 (或者DebugBreak(),或者Debugger.Break())指令是我们自己在代码里面硬编码进去的,因此我们在Visual Studio里,在相应的代码行里面点一下,出现一个小红球,也就是说Visual Studio在程序指令集某个地方动态地添加了一个INT 3指令。或者更具体一些,我们在源代码(文本文件)里面设置断点的,Visual Studio需要把代码行翻译成在程序指令集中的位置。Visual Studio之所以需要做翻译,是因为通常一行C++或者 C#代码都会对应好几行汇编指令。因此,Visual Studio需要一个额外的文件来执行这个翻译过程,这个额外的文件叫做调试符号文件(Symbols),是由编译器生成的。Visual Studio系列的编译器,不论是C#、VB.NET还是C++编译器都会生成这个调试符号文件,.pdb 文件。所以如果你花一点时间Debug文件夹的话,你就会发现这个文件。
       条件断点:
       首先我们先看看如何设置条件断点,条件断点有两种,一种是根据触发的次数来设置,另外一种是根据一条预置的条件来设置。
       根据触发次数设置比如说,你有一个循环,循环1000次,你知道有一个BUG总是在500次之后才会出现,因此肯定希望在循环内设置一个断点,但是前面500次都不会触发这个断点,否则连续按500次的F5的确不是一件轻松的差事。
       根据预置条件来设置。如果你已经知道一些条件可能会引发Bug,那么根据条件来设置则最合适不过了。
       在“断点条件(Breakpoint Condition)”对话框里面,只需要输入一条正常的C#、C++或者VB.NET的语句就可以了(当然,语法是根据你项目里面的源代码语法一致),这条语句的要求是必须返回bool值—否则就不是一个条件了。第三个还有断点过滤器,当你在断点上,右键点击弹出的菜单里面,会有一个“过滤(Filter)”菜单,它允许你限制将断点仅设置在特定的线程上。这里我就不细讲了,有兴趣的话,可以自己写一个多线程或者多进程程序试试这个功能。知道断点的原理以后,理解条件断点应该就不会是问题了。
        监视断点:

        有的时候,你可能需要查看程序内部一些变量的值,但是你又不希望中断程序的执行。这个时候,监视断点就很有用了,Visual Studio的监视断点就可以让你做到在不修改程序源代码的前提下,在调试器窗口中打印一些变量的值。对于监视断点我的理解不多,可以说是不理解,不过我想学习既然是重复的,那么这些问题在接下来的学习生活中还会遇到,那个时候就让我继续总结断点调试这个篇章。

【结尾】

       对于断点调试我印象最深刻的就是师傅和小伙伴们帮助我时使用的那些技巧,但是还是需要自己去实践去使用才会有更深的体会,今天的总结是对与断点调试的初印象+加深理解,接下来遇到它的时候才是在熟练中碰出更多的火花!

【福利】

        调试技巧(断点调试)


0 0