调试与异常处理-软件程序开发基础培训讲义_第1页
调试与异常处理-软件程序开发基础培训讲义_第2页
调试与异常处理-软件程序开发基础培训讲义_第3页
调试与异常处理-软件程序开发基础培训讲义_第4页
调试与异常处理-软件程序开发基础培训讲义_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

调试与异常处理,Zhanghz 2006.12.24,本章要点,开发过程难免遇到各种错误,这时就需要调试。调试是解决程序错误的主要手段,同时也是程序开发周期不可缺少的阶段,在程序开发的早期显得尤为重要。在对单个组件全面调试后,整个应用程序的调试工作就十分简单了。.NET中提供了强大的调试功能。 纲要 程序错误类型 .NET的调试环境 程序运行的异常捕获和处理,编程中出现错误是难免的,掌握有效的调试手段和完善错误处理对于编写一个比较完美的程序来说十分重要。 错误的产生可能是误删除文件、磁盘已满等操作问题,这会导致代码运行时产生错误,处理这类错误需要在程序中添加错误处理代码;也有些错误是代码本身的问题,这样的错误俗称Bug。 在应用程序中发现并排除错误的过程就叫做调试。,程序错误,常见的错误有三种: 编译错误 运行时错误 逻辑错误 编译错误 程序在编译过程中出现的错误。主要是由于没有正确编写代码而产生的,比如非法使用或丢失关键字、遗漏了某些标点符号、函数调用缺少参数等等。如下面几个例子 System.Console.Writef(“hello”); /Write拼写错误double X = 50.0 / 分号缺失 在输入代码时,.NET系统会自动进行语法检查。在查找到违反语法规则的语句时,会有红色的下划曲线提示,即时通知用户。这对减少或避免编译错误有很大帮助。,运行时错误 应用程序在运行之间执行了非法操作或某些操作失败,如打开的文件不存在、磁盘空间不足、网络未连接、除法除数为零等。这类错误在编译时一般难以发现,要在运行时才表现出来。 常见的运行时错误有 数组越界int i;int x = new int4;for( i=0; i5; i+) xi = i; /越界 除数为0for( i=0; i5; i+) xi = 4/ i; / i初始为0,逻辑错误 程序没有按预期方式执行时就会产生逻辑错误。从语法上看不出应用程序代码的错误,它可以顺利地执行,但得不到应有的结果。这一类错误的调试最复杂,要认真地分析,借助调试工具来跟踪变量值等操作才能查出原因。 编译错误将在错误列表中列出当前遇到的相应错误项,同时在出错的地方会有一个黄色的小箭头,单击相应的帮助可以知道出错的原因;运行时错误会有一个提示消息框,可以单击查看详细信息来查找出错原因;逻辑错误需要使用一些调试窗口,如断点设置、调用堆栈等来排除。,程序调试,VS.NET提供的调试工具可以用来分析代码的运行过程及变量和属性的变化。在应用程序的整个开发过程中,调试过程占有极大比重。正确地选择和使用调试器能够节省大量的时间、开发出更加可靠的程序。VS.NET为用户提供了一个集成的调试器,它支持VS.NET的所有开发语言并且使用的是一致的用户界面、支持跨越多种语言进行调试等。在使用集成调试器调试程序前,要进行一些设置和准备工作(如果使用模板创建程序,则这一步可以自动完成)。应用程序模板提供了两个配置:发行配置和调试配置。 调试配置中,调试应用程序时所需要的各项参数和选项都进行了充分的设置,并且使用这个配置生成应用程序中含有大量的调试信息。 发行配置中,主要为发行应用程序设置一些优化选项和参数。使得生成的应用程序更小更快。,控制程序的执行,调试程序的过程中可以充分控制应用程序的执行过程,包括以不同方式启动调试过程、中断应用程序的执行、步进执行程序、运行到指定位置以及终止应用程序的执行等。 启动应用程序:可以通过调试菜单,有多种方式。 开始执行:这种方式下,程序执行,直到碰到断点或者是程序结束。一般刚开始调试程序或设置了断点才使用这个方式启动程序。 逐语句:在这种方式下,程序执行完第1条语句后中断。当有函数调用时,执行过程会进入被调用函数的内部。 逐过程:这种方式与逐语句类似,只是不进入函数内部,而把函数调用作为一条语句执行。,【停止调试】菜单项或是工具栏的终止按钮:随时终止调试;【全部中断】菜单项或是工具栏的全部中断按钮:随时中断程序的执行而进入中断状态,调试器的很多功能只有在中断状态下才能使用;【继续】菜单项或继续按钮:恢复中断程序的执行。 调试中经常使用断点来中断程序,从而使用调试器提供的强大功能。 查看变量的值 寄存器和内存的使用情况 函数调用情况等等 调试代码的执行可以有三种步进单位,可以通过【调试方式】子菜单来选择。 行:一次执行一行源代码(一行代码可能包含多个语句)。 语句:一次执行一条语句。 指令:一次执行一条机器指令。,附加到进程,VS.NET调试器能够附加在集成开发环境外部运行的进程上,通过这个方式可以调试多种程序。一旦附加到进程上,就可以使用调试器提供的各种功能控制程序的运行和查看进程状态。 正在运行的应用程序 多个程序同时调试 远程机器上的程序 应用程序崩溃时自动启动调试器。附加的步骤 【调试】|【附加到进程】“附加到进程”对话框。 从【可用进程】列表框选择目标进程。如果目标进程位于远程机器上,需要在对话框上面的【传输】和【限定符】下拉列表框选择一个远程计算机,刷新进程列表。 【附加】按钮完成选择。,断点,断点是调试应用程序时经常使用的一种工具。调试器遇到一个断点时就要中断程序的执行而转入中断模式。 断点类型 函数断点:断点标识的位置是特定函数中的偏移位置。 文件断点:断点标识的位置是特定文件中的偏移地址。 地址断点:断点标识的位置是内存地址。 数据断点:断点标识某个变量并且每当这个变量发生变化时就会产生中断。 断点的插入:使用菜单命令和使用指示器边距。 使用指示器边距边距插入的断点是文件类型的断点,并且只能插入这种类型断点。 使用菜单方式:【调试】|【新建断点】,选择相应类型的断点输入必要内容。,条件触发断点 通过设置断点属性,在满足一定条件时才中断。 【调试】|【窗口】|【断点】打开断点管理窗口设置属性。 点击次数。对于位置断点,是指执行到指定位置的次数;对于数据断点,是指变量的值发生改变的次数。这个属性决定在中断执行前要发生多少次点击。 这个属性可以指定的值有:总是中断(默认)、点击次数等于特定值时、点击次数是特定值的某个倍数时、点击次数大于或等于特定值时。 设置方法:右击目标断点【命中次数】【断点命中次数】对话框选择并指定命中次数。 条件。这是一个表达式,每次到达断点时计算表达式的值,根据结果决定这次是否有效中断。如果有效且满足点击次数,则执行中断。 设置方法:右击目标断点【条件】【断点条件】对话框输入条件表达式并选择条件有效方式。,【断点】窗口 用于查看所有类型的断点和它们的详细信息。可以使用其中的工具栏来执行断点操作。 代码编辑器内只会显示源代码的函数断点和文件断点。 已激活的断点会显示为选定状态,禁用的断点前的复选框是空的 断点的禁用与删除 【禁用断点】命令或者是Ctrl+F9组合键,禁用或启用。 【清除所有断点】命令或是Ctrl+Shift+F9组合键,删除文件中所有断点;光标定位到指定断点位置【移除断点】命令删除特定断点。,查看程序状态,【自动窗口】:显示当前语句和前一条语句中的变量。结构或数组类型的变量在该窗口中以树的形式显示。 【局部窗口】:显示当前上下文中的局部变量。默认的上下文是指包含当前执行位置的函数,所以这里显示的是这个函数中的局部变量。 【监视窗口】:可以在这里计算变量和表达式的值,然后随着程序的执行观察它们的变化。最多可以使用4个监视窗口。 【内存窗口】:用于查看内存中的数据。可以同时打开4个内存窗口,还可以指定内存窗口显示的起始地址。 【寄存器窗口】:动态显示寄存器的内容,最新改变的寄存器使用红色表示。也可以在这里手动改变寄存器值。 【调用堆栈窗口】:查看当前堆栈中的函数调用情况,这里会显示每个函数的名字及其编写语言。可以从这里跳转到函数源代码,也可以查看函数的反汇编代码。 【反汇编窗口】:显示被调试程序的反汇编代码。,使用调用堆栈,代码执行时,操作系统和CPU会保存调用函数链的记录,这些调用函数共同操作才使得当前的指令得以执行。而这个记录就存放在一个被称为调用堆栈的临时结构中。随着程序的运行,堆栈会相应地增加或减小。 堆栈的内容对调试很有用,因为这里能提供当前操作环境的有关信息。 断点可以使代码在指定位置暂停,但只有调用堆栈才能提供到达代码中指定位置的路径。 如果正在运行的是一个被多处调用的方法,调用堆栈可以提供在调用链中的当前方法前被调用的方法的顺序。,调试过程中可以显示【调试位置】工具栏,指示了当前程序、线程和堆栈帧。 在断点处中断时,调用堆栈的内容会显示在堆栈帧组合框中。从组合框里选择一个记录就会跳转到堆栈中被引用的代码位置。 或者通过【调用堆栈】窗口显示堆栈。只有程序在断点处中止时,【调用堆栈】窗口的内容才可用。 在断点处中断时,可以通过选择一个记录并按下F9键的方式向【调用堆栈】窗口中添加断点。这是不需要手工逐步调试而快速返回到堆栈中的位置的有效方式。,Trace和Debug类,在.NET中提供了对跟踪处理和调试信息的有力支持,可以使用控制跟踪和调试输出信息的类,把输出信息写入文件、流和事件日志中。 生成程序的跟踪信息 跟踪类Trace和调试类Debug都在命名空间System.Diagnostics中定义,它们为基本跟踪功能提供了便利的访问方法。如,下面代码会发送一个调试信息到控制台。 Debug.WriteLine(“Hello Debugger”); 使用Debug类生成输出信息时,只能输出到.NET调试版本的输出设备。Trace类与Debug类相似,不过它用于为所有内部版本产生输出消息。,在创建新的项目配置设置时,要定义DEBUG符号来启用Debug类的输出,定义TRACE符号启用Trace类的输出。 显示消息 Trace和Debug类都是由静态方法构成的,所以不要创建它们的实例。它们通过同样的方式公开同样的方法和操作,唯一区别在于它们由不同的条件编译符号启用。 常用的方法和属性 Assert,如果提供的表达式为false,则产生一个声明违例的消息。 AutoFlush,获取或设置一个Boolean类型的值。这个值表示侦听器在每次写操作后是否自动刷新。 Close,刷新消息缓存并关闭所有侦听器。 Fail,生成声明违例的消息。,Write,生成一个没有附带换行符的输出消息。 WriteLine,生成一个附带换行符的输出消息。 WriteIf,如果提供的表达式为True,则生成一个没有附带换行符的输出消息。 WriteLineIf,如果提供的表达式为True,则生成一个附带换行符的输出消息。 Assert方法 用于在一个希望为True的条件表达式被测定为False时,显示错误信息。 有3个版本 Debug.Assert( i0 ); 直接接收一个触发声明的表达式。 Debug.Assert( i0, “I error”); 第二个参数描述声明错误的简短消息 Debug.Assert( i0, “I error”, m.ToString() ); 第三个参数包含声明错误具体信息,Fail方法 与Assert方法类似,不同在于消息总是被发送给侦听器。由这个方法产生的跟踪和调试消息会作为声明错误显示,方式与Assert方法生成的错误声明相同。 两个版本 Debug.Fail( “failure” ); 第一个参数接收错误描述 Debug.Fail( “failure”, “could not open” ); 第二个参数接收提供关于错误的详细描述。 Write系列方法 用于编写通用的输出消息。包含Write、WriteIf、WriteLine和WriteLineIf四个方法,用于生成非必要的显示存在错误的提示性信息。 Write和WriteIf生成的消息不带终止符。在WriteIf方法中包含一个控制输出的参数,参数为真则显示跟踪或调试消息;否则不产生任何消息。,有4个重载版本 1.使用字符串作为参数生成输出消息Trace.Write(“Close Button”);Trace.WriteIf( count3, “Close Button”); 2.接收任何对象的参数,通过对象的ToString方法生成发送给侦听器的输出消息Trace.Write(sender);Trace.WriteIf( count3, sender); 3.第三和第四个版本中,增加接收附加的用于指定消息类型名的字符串参数。Trace.Write(sender, “Overdraft” );Trace.WriteIf( count3, sender, “Overdraft” );WriteLine和WriteLineIf方法的使用方式相同。,异常捕获及处理,通过throw、try-catch、finally语句实现结构化、统一的、类型安全的异常处理机制。 throw语句 在程序执行时遇到异常情况,如打开不存在的文件等,就可以使用throw语句来报告异常。 throw语句格式:throw 异常对象 异常对象是从System.Exception类型派生的类实例。它包含一个Message属性,详细描述导致异常的原因。 try-catch语句 进行异常处理。可能导致异常的语句放在try部分,如果捕获到有异常发生就会转移到catch部分,否则程序就往下继续执行。一个try语句可以对应多个catch子句,类似switch-case。 try-catch语句格式:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论