第08章 程序调试与创建可执行文件
第8章+异常处理结构与程序调试

8.5 用sys模块回溯最后的异常
sys.exc_info()可以直接定位最终引发异常的原因, 结果也比较简洁,但是缺点是难以直接确定引发 异常的代码位置。
8.5 用sys模块回溯最后的异常
>>> def A(): >>> def B(): >>> def C(): 1/0 A() B()
>>> C() Traceback (most recent call last): File "<pyshell#35>", line 1, in <module> C() File "<pyshell#34>", line 2, in C B() File "<pyshell#31>", line 2, in B A() File "<pyshell#28>", line 2, in A 1/0 ZeroDivisionError: integer division or modulo by zero >>> try: C() except: r = sys.exc_info() print(r) (<type 'exceptions.ZeroDivisionError'>, ZeroDivisionError('integer division or modulo by zero',), <traceback object at 0x0134C990>)
TRY…EXCEPT…ELSE…FINALLY结构
try...except结构
实验1程序调试实验

实验 1 程序调试实验一:实验目的:1.学习及掌握汇编语言源程序的大体结构,明确程序中各段的功能和彼此之间的关系。
2.熟练掌握在计算机上成立、汇编、连接、调试及运行程序的方式。
3、熟悉和掌握DEBUG常常利用命令的利用二:实验内容:1.汇编语言源程序的成立2.将源程序文件汇编成目标程序文件一般情况下,MASM汇编程序的主要功能有以下3点:(1)检查源程序中存在的语法错误,并给犯错误信息。
(2)源程序经汇编后没有错误,则产生目标程序文件,扩展名为.OBJ。
(3)若程序中利用了宏指令,则汇编程序将展开宏指令。
汇编进程的错误分警告错误(Warning Errors)和严重错误(Severe Errors)两种。
其中警告错误是指汇编程序以为的一般性错误;严重错误是指汇编程序以为无法进行正确汇编的错误,并给犯错误的个数、错误的性质。
这时,就要对错误进行分析,找出原因和问题,然后再挪用屏幕编辑程序加以修改,修改以后再从头汇编,一直到汇编无错误为止。
3.用连接程序生成可执行程序文件经汇编以后产生的目标程序文件(.OBJ文件)并非是可执行程序文件,必需通过连接以后,才能成为可执行文件(即扩展名为.EXE)。
4.程序的执行成立了正确的可执行文件以后,就可以够执行该程序。
本程序当中没有效到DOS中断挪用指令,所以在屏幕上看不到程序执行的结果。
可以采用调试程序DEBUG来进行检查。
三:实验程序:1.两字节的二进制数加法要求:在存储单元A起有两字节的无符号加数,在单元B起有两个字节的无符号被加数,将其两数相加,结果存到C单元处。
设二进制数低字节数在前,高字节数在后。
DATA SEGMENTA DB 11H,22H ;概念一字节变量A,赋初值11H,其后内存字节单元中寄存22HB DB 33H,44H ;概念一字节变量B,赋初值33H,其后内存字节单元中存44HD DB?,? ;概念一字节变量D,并预留两个字节的空间DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA ;成立断与段寄放器的对应关系START:MOV AX,DATAMOV DS,AXMOV AL,A ;将A单元的内容赋给AL寄放器ADD AL,B ;将AL的内容与B中内容相加,并赋给ALMOV D,AL ;将AL的内容赋给D单元MOV AL,A+1ADC AL,B+1MOV D+1,ALMOV AH,4CH ;结束的正常语句INT 21HCODE ENDSEND START2. 在内存TAB开始的16个单元持续寄存了0-15的平方值(0-225),任给一个数X(0 ≤ X ≤15),求X的平方值,并把结果寄存在Y单元中。
C语言与程序设计教程第8章

第8章 文件
使用文件的方式共有12种,表8.1给出它们的符号和意义。
表8.1 文件打开方式
第8章 文件
表中“rb”即英文“read binary”的缩写,而“wt”则是英 文“write text”的缩写;此外,表8.1中的t一律可以略去,即 “rt”可直接写成“r”,“wt+”可直接写成“w+”。
第8章 文件
上述三个步骤是按顺序进行的,所以打开文件是对文件 进行读/写的前提;打开文件就是将指定的文件与当前执行的 程序联系起来,建立了外存数据文件与内存中这个程序的数 据传递通道,也即为文件的读/写操作做好准备。当需要为写 操作打开一个文件时,如果该文件不存在,则系统会先创建 这个文件;当需要为读操作打开一个文件时,则这个文件必 须是已经存在的文件,否则就会出错。
文件指针变量=fopen(文件名,打开文件方式); 其中,文件指针变量必须是被说明为FILE类型的指针变 量;文件名是被打开的文件名,它可以是字符串常量或字符 串数组;打开文件方式是指文件的类型和操作要求。例如:
FILE *fp; fp=("file1","r");
第8章 文件
其功能是在当前目录下打开文件file1,只允许对文件进 行读操作,并使指针变量fp指向该文件。又如:
第8章 文件
8.2.2 文件的关闭
文件一旦使用完毕应当立即关闭,以避免文件数据的丢 失或者文件被再次误用,关闭文件完成以下工作:
(1) 如果文件是以“写”或“读写”方式打开的,则把 缓冲区中还未存入文件的剩余数据存储到文件中。
(2) 断开文件指针变量与这个文件的联系,此时文件指 针变量可用于指向其他文件。
(3) 用“w”打开的文件只能向该文件写入数据。 若打开的文件不存在,则以指定的文件名创建一个 新文件;若打开的文件已经存在,则删除该文件(即 意味着该文件中的原有数据全部丢失),然后以这个 文件名重新创建一个新文件。
第8章(301)

第8章 源文件和程序
实体 命名的名字空间 类型定义 模板声明 模板定义 函数声明 在线函数定义 变量声明 常量定义 枚举类型定义 类名声明 #include 指令 宏定义 条件编译指令 注释
表 8.1 头文件中应包括的内容
示例说明 namespace N { /* … */ } struct Point { int x, y; }; template<class T> class Z; template<calss T> class V { /* … */ }; extern int strlen(const char*); inline char get(char* p) { return *p++; } extern int a; const float PI = 3.141593; enum Color { red, yellow, green }; class Matrix; #include <algorithm> #define VERSION 12 #ifdef _cplusplus //check for end of file
第8章 源文件和程序
保证各编译单元自定义类型一致的有效办法是使得每一 个类型仅在一个源文件中定义。通常采用头文件(Header Files)机制以实现这一目标,即将各种自定义类型写入到特 定的头文件中,然后再利用#include指令将其包含到使用该 自定义类型的各文件中。
第8章 源文件和程序
8.2.2 头文件 头文件(Header)是一种特殊的文件,它是共享性信息的
第8章 源文件和程序
因此,为了进行一个C++程序各编译单元的成功链接, 程序员的任务是:
Delphi 第08章_Windows高级编程

LoadLibrary函数、GetProcAdrress函数和FreeLibrary函数来实现
DLL文件的动态调用。 1.静态调用
静态调用又称为隐式加载方式,它是通过单元体中Interface部分的
External指示字所列出需要调用DLL文件的过程或函数。这些被指定 的DLL文件中的过程是在程序执行之前被加载进内存的。
8.1.2 创建DLL
通过Delphi XE8主菜单的【File】|【New】|【Other】在弹出的【New Items】对话框 中,选择Dynamic-link Library图标,单击【OK】按钮,系统将自动创建一个DLL项 目。 DLL和Application项目文件的格式对比
DLL项目文件的主要格式如下: Library 项目名; Uses 子句; Exports 子句; //数据接口函数 Begin End. //程序执行体
在Delphi XE8中,存在一个调用约定的问题。调用约定就是指调用例程时参数的传递顺序。 在Delphi XE8中DLL支持的调用约定如表所示。
调用约定 Registe到右 从右到左
Cdecl
Safecall
从右到左
从右到左
使用静态调用方式,有两个缺点:一是当要加载的DLL文件不存在或者没有指定调用的过 程时,程序就会自动停止运行,或可能致使程序出错;二是一旦所需的DLL文件被加载 至内存后,即使不再需要,其仍然停留在应用程序的地址空间中。
8.2.2添加新属性 要给接口增加属性或方法,需要用【View】|【Type Library】| 【Type Library】编辑器,同时在IButtonX上单击鼠标右键,选择
【New】|【Property】。单击该菜单项后,将弹出如图所示的对话
设备驱动程序的创建与调试

驱动程序测试
观察与体验
如果驱动程序工作正常,屏幕显示为:
驱动程序调试
观察与体验
如果驱动程序工作不正常,则需要进行调试
支持驱动程序调试的工具为Microsoft的Debugging
Tools for Windows
WinDbg 是一个功能齐全的调试器,支持C语言源代码 级调试,可以使用驱动程序的源代码设置各种断点。 WinDbg的使用需要双机环境,目标机运行驱动程序和 测试应用程序,宿主机运行调试器,使用起来不是特 别方便
WdmDriver.h guid.h init.cpp Pnp.cpp Wmi.cpp Dispatch.cpp Wdm.mof
编辑、编译和链接
观察与体验
(2)编译链接驱动程序,生成驱动程序可执行文件
成功编译一个驱动程序需要在要被编译的源文件目录下面 提供三个文本文件(三个文件都没有扩展名):
MAKEFILE
编辑、编译和链接
观察与体验
(2)编译链接驱备驱动程序的自动安装由一个以inf为扩展 名的文本文件控制。正确的保存在Windows 系统上的一个inf文件,允许自动安装驱动程 序文件,或者在对话框支持下安装驱动程序 文件
观察与体验
安装驱动程序
观察与体验
安装驱动程序
安装之后,WdmDriver应该出现在设备管理器 的“其它设备”类别中,选中该设备,单击“属 性”,可以查看驱动程序的信息
驱动程序测试
观察与体验
测试程序TestWdm.cpp执行以下操作: 打开wdmdriver设备 读存储在共享内存缓冲区中的第一个DWORD。 把0xabcdef01写到缓冲区 从缓冲区中读取4个字节 往缓冲区写5个字节,因为设置的缓冲区大小只 有4个字节,所以会失败,并报错 关闭设备
C#程序设计实用教程-第8章 调试与异常处理
8.1.2寻找逻辑错误 与语法错误相比,逻辑错误是更让人头痛的问题。 逻辑错误是指代码在语法上没有错误,但是从程序的 功能上看,代码却无法正确完成其功能。
同样可以使用VS来寻找逻辑错误。在调试模式下运 行程序时,VS并非仅仅是给出最后的结果,还保留了 应用程序所有的中间结果,即VS知道代码每一行都发 生了什么。既然这样,程序员就可以通过跟踪这些中 间结果,来发现Bug到底藏在哪里。
/// <summary> /// 使用异常处理机制示例 /// </summary> public void test_withtry() {
int[] arr={0,1,2}; try {
for(int i=0;i<=3;i++) //i==3时,越界了! {
Console.WriteLine(arr[i]); } } catch(Exception e) { Console.WriteLine(e.Message); } finally { Console.WriteLine("Exit test_withtry()"); }
✓单击“逐语句”按钮 或按下F11键,程序从断点处逐语句执 行,黄色显示当前要执行的语句。当程序逐句执行时,可以从 “局部变量”窗口查看当前变量的值,在即时窗口检查某个变 量或表达式的值,还可以在即时窗口中执行一些Visual Studio 命令。 ✓选择“调试”→“窗口”,打开“局部变量”窗口,如图8-7 所示,在这个窗口中,可以看到当前方法中的局部变量的值。 打开“即时窗口”,如图8-8所示,在这个窗口可以输入命令, 查看变量,或计算表达式的值。
C++程序设计教程 第8章 Windows窗体应用程序
8.3 窗体与控件
8.3.1 窗体与对话框
C#是一种面向对象的可视化的程序设计语言,图形界面的设计与开发 并不需要编写大量代码。Windows 窗体和控件是开发 C#应用程序的基础, 在 C#应用程序设计中扮演着重要的角色。每一个Windows 窗体和控件都 是一个对象,也都是一个实例。
窗体是可视化程序设计的基础界面,是其他对象的载体或容器,在窗 体上可以直接“可视化”地创建应用程序,可以放置应用程序所需的控 件以及图形、图像,并可以改变其大小、位置等,每个窗体对应于应用 程序的一个运行窗口。
8.2 C#基础
8.2.1 标识符与关键字
标识符(identifier)是对程序中各元素进行定义的名字,如变量名、类 名、方法名等。标识符命名规则与 C++类似,尽量“见名知义”,命名 样式主要有 Pascal、Camel 和 Upper 3 种。
关键字是 C#编译器预定义的保留字,这些关键字不能用作标识符,例 如 using、namespace、this等。有些关键字在代码的上下文中有特殊的意 义,被称为上下文关键字,例如 partial。C#中的关键字共有 77 个,上下 文关键字共有 17 个。
double value = 1.0; try {
string input = "3.14"; //得到一个非双精 度型的值,例如字符串
value = Convert.ToDouble(input); } catch(Exception oString()); //输出 异常信息 } finally {
• 带标题的消息框,格式为: MessageBox.Show("消息内容", "消息框标题");
第8章编译与发布程序
8.1.4减少错误的方法
⒈备份原始文件; ⒉检查介质完整性; ⒊隔离测试环境; ⒋将应用程序分割成单独工作模块; ⒌保护内存变量; ⒍不要对运行环境进行假设; ⒎逐步测试。
8.1.5调试程序
在VFP中调试程序可以使用调试器。调试器功 能: 使用“跟踪”窗口查看正在执行的程序; 使用“监视”窗口显示当前程序、过程或方法中可 见的变量、数组、对象及对象成员,显示表达式及 其当前值,可在表达式上设置断点; 使用“调用堆栈”显示正在执行的程序、过程、方 法; 使用“调试输出”窗口显示程序中指定调试的输出。
上一次课主要学习的内容
1.隐藏VFP窗口两种 方上一法次是课讲什到么主程?序的功能、类型2、.环V境F设P置开、事始件和处理结及束防止 程序多次启动的方法。请同学们回事顾这件样处两个理问题的:方法是
什么?
①使用代码,在主程序中添加如下代码:_Screen=.f. ②建立Config.fpw文件,加入一行:SCREEN=OFF
VFP中开始事件处理可以使用Read Events命令,时使用Clear Events 结束事件处理,将控制权交给 系统,系统开始处理Read Events后面的命令。
第8章.编译与发布程序
本章主要介绍如何减少程序错误、测试调试程 序、连编程序和发布程序。
.安装向导操作步骤
⒈创建Wzsetup.ini,包含安装向导对该发布树的 设置的各选项; ⒉确保运行发布的应用程序所需的所有文件随应用 程序一起发布; ⒊把压缩过的文件复制到位于发布磁盘目录中的子 目录下; ⒋创建两个安装文件Setup.inf、Setup.stf用于指 定安装参数; ⒌创建DkContrl.dbf和DkContrl.cdx,包含文件压 缩并指定给哪个磁盘子目录的统计信息。
第8章 程序异常处理与调试技术
结束放映
• 在Delphi中有四种程序错误: 设计期错误:进行可视化设计时发生的错误。
一种是编译错误,在程序编辑阶段就可以由编 译器发现并给出提示。 另外一种是运行错误,这类错误不能在编译阶
段查出,只能在程序执行时发现,称为运行错
误。 逻辑错误:程序已经通过编译并能够顺利执行, 但是结果与期望的不同,这种错误统称为逻辑 错误。
结束放映
8.1.2 Try_Finally 结构
•Try_Fianally 的一般结构为: Try … //需要保护的程序语句序列 Finally … //一定执行的语句序列 End; • 例如打开一个文件并进行处理,在处理完成后必须 关闭文件。则可以使用类似下面的结构:
结束放映
Var TxtFile: TextFile; //定义文本文件变量存放打开的文件名字 Begin If (OpenDialog1.Execute) Then //使用文件打开对话框 Begin Try AssignFile(TxtFile,OpenDialog1.FileName);
• 对于在应用程序中经常产生的异常,Delphi都进行 了定义:
在SysUtils单元中定义了: 类型转换异常(EConvertError), 数学异常(EMathError), 输入输出异常(EInOutError)等; 在ComCtrl单元定义了:日期异常(EDateTimeError), 在Db单元中定义了:数据库异常(EDatabaseError),等。 因此只需在单元中引用这些系统库单元就可以处理这些 异常
结束放映
Function StrToIntRange(const S: string; Min, Max: Longint):Longint; begin Result := StrToInt(S); if (Result<Min) or (Result>Max) then raise ERangeError.CreateFmt(‘发生错误,%d 不在%d..%d 之 内’,[Result, Min, Max]); //由Raise提交异常 end;