debug调试运行正常但在release模式下退出程序时报错

debug调试运行正常但在release模式下退出程序时报错
debug调试运行正常但在release模式下退出程序时报错

Debug调试运行正常,但在Release模式下退出程序时报错

Debug调试运行正常,但在Release模式下退出程序时报错分类:

c/c++

Windows编程

2012-08-30 12:43

641人阅读

评论(0)

收藏

举报

优化编译器librarymfc多线程exception

在最近的H.265分析器项目中,出现了一个问题,就是在Debug模式下运行正常,但是在Release模式下时,退出程序时,会报出以下错误:the instruction at"0x78d80f87" referenced memory at "0x70665f70" the memory could not be read。在Release调试状态下,出现一个提示First-chance exception at 0x7c96f749 in H.265 Anayer.exe:

0xC0000005: Access

violation reading location 0x385f735d.调试了很久都没有找到错误的所在,在网上找了一些资料,基本上确定应该是Release优化过程中造成了内存分配与释放发生了错误,但是还是没有找到具体的代码位置,纠结中,所以先记录下来这个问题。下面是网上找的一些这方面的介绍:

https://www.360docs.net/doc/607601586.html,/content/09/1025/13/799_7823620. shtml

Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。

Debug 和Release 的真正秘密,在于一组编译选项。下面列出了分别针对二者的选项(当然除此之外还有其他一些,如/Fd /Fo,但区别并不重要,通常他们也不会引起Release 版错误,在此不讨论)

以下参数均是在project–>settings–>C/C –>Project Options:

Debug 版本

参数含义

/MDd /MLd 或/MTd 使用Debug runtime library(调试版本的运行时刻函数库)

/Od 关闭优化开关

/D “_DEBUG” 相当于#define _DEBUG,打开编译调试代码开关(主要针对assert函数)

/ZI 创建Edit and continue(编辑继续)数据库,这样在调试过程中如果修改了源代码不需重新编译

/GZ 可以帮助捕获内存错误

/Gm 打开最小化重链接开关,减少链接时间

Release 版本

参数含义

/MD /ML 或/MT 使用发布版本的运行时刻函数库

/O1 或/O2 优化开关,使程序最小或最快

/D “NDEBUG” 关闭条件编译调试代码开关(即不编译assert 函数)

/GF 合并重复的字符串,并将字符串常量放到只读内存,防止被修改

实际上,Debug 和Release 并没有本质的界限,他们只是一组编译选项的集合,编译器只是按照预定的选项行动。事实上,我们甚至可以修改这些选项,从而得到优化过的调试版本或是带跟踪语句的发布版本。

哪些情况下Release 版会出错

有了上面的介绍,我们再来逐个对照这些选项看看Release 版错误是怎样产生的

1. Runtime Library:链接哪种运行时刻函数库通常只对程序的性能产生影响。调试版本的Runtime Library 包含了调试信息,并采用了一些保护机制以帮助发现错误,因此性能不如发布版本。编译器提供的Runtime Library 通常很稳定,不会造成Release 版错误;倒是由于Debug 的Runtime Library 加强了对错误的检测,如堆内存分配,有时会出现Debug 有错但Release 正常的现象。应当指出的是,如果Debug 有错,即使Release 正常,程序肯定是有

Bug 的,只不过可能是Release 版的某次运行没有表现出来而已。

2. 优化:这是造成错误的主要原因,因为关闭优化时源程序基本上是直接翻译的,而打开优化后编译器会作出一系列假设。这类错误主要有以下几种:

1. 帧指针(Frame Pointer)省略(简称FPO ):在函数调用过程中,所有调用信息(返回地址、参数)以及自动变量都是放在栈中的。若函数的声明与实现不同(参数、返回值、调用方式),就会产生错误????但Debug 方式下,栈的访问通过EBP 寄存器保存的地址实现,如果没有发生数组越界之类的错误(或是越界“不多”),函数通常能正常执行;Release 方式下,优化会省略EBP 栈基址指针,这样通过

一个全局指针访问栈就会造成返回地址错误是程序崩溃。C 的强类型特性能检查出大多数这样的错误,但如果用了强制类型转换,就不行了。你可以在

Release 版本中强制加入/Oy- 编译选项来关掉帧指针省略,以确定是否此类错误。此类错误通常有:

MFC 消息响应函数书写错误。正确的应为:afx_msg LRESULT OnMessageOwn(WPARAM wparam, LPARAM lparam);

ON_MESSAGE 宏包含强制类型转换。防止这种错误的方法之一是重定义ON_MESSAGE 宏,把下列代码加到stdafx.h 中(在#include “afxwin.h”之后),函数原形错误时编译会报错。#undef ON_MESSAGE

#define ON_MESSAGE(message, memberFxn) \

{ message, 0, 0, 0, AfxSig_lwl, \

(AFX_PMSG)(AFX_PMSGW)(static_cast

(&memberFxn) },

2. volatile 型变量:volatile 告诉编译器该变量可能被程序之外的未知方式修改(如系统、其他进程和线程)。优化程序为了使程序性能提高,常把一些变量放在寄存器中(类似于register 关键字),而其他进程只能对该变量所在的内存进行修改,而寄存器中的值没变。如果你的程序是多线程的,或者你发现某个变量的值与预期的不符而你确信已正确的设

置了,则很可能遇到这样的问题。这种错误有时会表现为程序在最快优化出错而最小优化正常。把你认为可疑的变量加上volatile 试试。

3. 变量优化:优化程序会根据变量的使用情况优化变量。例如,函数中有一个未被使用的变量,在Debug 版中它有可能掩盖一个数组越界,而在Release 版中,这个变量很可能被优化调,此时数组越界会破坏栈中有用的数据。当然,实际的情况会比这复杂得多。与此有关的错误有:

非法访问,包括数组越界、指针错误等。例如void fn(void)

{

int i;

i = 1;

int a[4];

{

int j;

j = 1;

}

a[-1] = 1;//当然错误不会这么明显,例如下标是变量

a[4] = 1;

}

j 虽然在数组越界时已出了作用域,但其空间并未收回,因而i 和j 就会掩盖越界。而Release 版由于i、j 并未其很大作用可能会被优化掉,从而使栈被破坏。

3. _DEBUG 与NDEBUG :当定义了_DEBUG 时,assert() 函数会被编译,而NDEBUG 时不被编译。除此之外,VC 中还有一系列断言宏。这包括:

断言类型定义

ANSI C 断言void assert(int expression );

C Runtime Lib 断言_ASSERT( booleanExpression );

_ASSERTE( booleanExpression );

MFC 断言ASSERT( booleanExpression );

VERIFY( booleanExpression );

ASSERT_VALID( pObject );

ASSERT_KINDOF( classname, pobject );

ATL 断言ATLASSERT( booleanExpression );

此外,TRACE() 宏的编译也受_DEBUG 控制。

所有这些断言都只在Debug版中才被编译,而在Release 版中被忽略。唯一的例外是VERIFY() 。事实上,这些宏都是调用了assert() 函数,只不过附加了一些与库有关的调试代码。如果你在这些宏中加入了任何程序代码,而不只是布尔表达式(例如赋值、能改变变量值的函数调用等),那么Release 版都不会执行这些操作,从而造成错误。初学者很容易犯这类错误,查找的方法也很简单,因为这些宏都已在上面列出,只要利用VC 的Find in Files 功能在工程所有文件中找到用这些宏的地方再一一检查即可。另外,有些高手可能还会加入

#ifdef _DEBUG 之类的条件编译,也要注意一下。

顺便值得一提的是VERIFY() 宏,这个宏允许你将程序代码放在布尔表达式里。这个宏通常用来检查Windows API 的返回值。有些人可能为这个原因而滥用VERIFY() ,事实上这是危险的,因为VERIFY() 违反了断言的思想,不能使程序代码和调试代码完全分离,最终可能会带来很多麻烦。因此,专家们建议尽量少用这个宏。

4. /GZ 选项:这个选项会做以下这些事:1. 初始化内存和

变量。包括用0xCC 初始化所有自动变量,0xCD ( Cleared Data ) 初始化堆中分配的内存(即动态分配的内存,例如new ),0xDD ( Dead Data ) 填充已被释放的堆内存(例如delete ),0xFD( deFencde Data ) 初始化受保护的内存(debug 版在动态分配内存的前后加入保护内存以防止越

界访问),其中括号中的词是微软建议的助记词。这样做的

好处是这些值都很大,作为指针是不可能的(而且32

位系统中指针很少是奇数值,在有些系统中奇数的指针会产生运行时错误),作为数值也很少遇到,而且这些值也很容

易辨认,因此这很有利于在Debug 版中发现Release 版

才会遇到的错误。要特别注意的是,很多人认为编译器会用0 来初始化变量,这是错误的(而且这样很不利于查找错误)。

2. 通过函数指针调用函数时,会通过检查栈指针验证函数调用的匹配性。(防止原形不匹配)

3. 函数返回前检查栈指针,确认未被修改。(防止越界访问和原形不匹配,与第二项合在一起可大致模拟帧指针省略FPO )

通常/GZ 选项会造成Debug 版出错而Release 版正常

的现象,因为Release 版中未初始化的变量是随机的,这

有可能使指针指向一个有效地址而掩盖了非法访问。

除此之外,/Gm /GF 等选项造成错误的情况比较少,而且他们的效果显而易见,比较容易发现。

怎样“调试” Release 版的程序

遇到Debug 成功但Release 失败,显然是一件很沮丧的事,而且往往无从下手。如果你看了以上的分析,结合错误的具体表现,很快找出了错误,固然很好。但如果一时找不出,以下给出了一些在这种情况下的策略。

1. 前面已经提过,Debug 和Release 只是一组编译选项的差别,实际上并没有什么定义能区分二者。我们可以修改Release 版的编译选项来缩小错误范围。如上所述,可以把Release 的选项逐个改为与之相对的Debug 选项,如/MD 改为/MDd、/O1 改为/Od,或运行时间优化改为程序大小优化。注意,一次只改一个选项,看改哪个选项时错误消失,再对应该选项相关的错误,针对性地查找。这些选项在Project\Settings… 中都可以直接通过列表选取,通常不要手动修改。由于以上的分析已相当全面,这个方法是最有效的。

2. 在编程过程中就要时常注意测试Release 版本,以免最后代码太多,时间又很紧。

3. 在Debug 版中使用/W4 警告级别,这样可以从编译器获得最大限度的错误信息,比如if( i =0 )就会引起/W4 警告。不要忽略这些警告,通常这是你程序中的Bug 引起的。但有时/W4 会带来很多冗余信息,如未使用的函数参数警告,而很多消息处理函数都会忽略某些参数。我们可以用:#progma warning(disable: 4702) //禁止

//…

#progma warning(default: 4702) //重新允许来暂时禁止某个警告,或使用

#progma warning(push, 3) //设置警告级别为/W3

//…

#progma warning(pop) //重设为/W4

来暂时改变警告级别,有时你可以只在认为可疑的那一部分代码使用/W4。

4. 你也可以像Debug 一样调试你的Release 版,只要加入调试符号。在Project/Settings… 中,选中Settings for “Win32 Release”,选中C/C 标签,Category 选General,Debug Info 选Program Database。再在Link 标签Project options 最后加上“/OPT:REF” (引号不要输)。这样调试器就能使用pdb 文件中的调试符号。但调试时你会发现断点很难设置,变量也很难找到??这些都被优化过了。不过令人庆幸的是,Call

Stack 窗口仍然工作正常,即使帧指针被优化,栈信息(特别是返回地址)仍然能找到。这对定位错误很有帮助。

https://www.360docs.net/doc/607601586.html,/content/09/1025/13/799_7824140. shtml

1. 变量。

大家都知道,debug跟release在初始化变量时所做的操作是不同的,debug是将每个字节位都赋成0xcc(注1),而release的赋值近似于随机(我想是直接从内存中分配的,没

有初始化过)。这样就明确了,如果你的程序中的某个变量没被初始化就被引用,就很有可能出现异常:用作控制变量将导致流程导向不一致;用作数组下标将会使程序崩溃;更加可能是造成其他变量的不准确而引起其他的错误。所以在声明变量后马上对其初始化一个默认的值是最简单有效的办法,否则项目大了你找都没地方找。代码存在错误在debug 方式下可能会忽略而不被察觉到,如debug方式下数组越界也大多不会出错,在release中就暴露出来了,这个找起来就比较难了:(

还是自己多加注意吧2. 自定义消息的消息参数。

MFC为我们提供了很好的消息机制,更增加了自定义消息,好处我就不用多说了。这也存在debug跟release的问题吗?答案是肯定的。在自定义消息的函数体声明时,时常会看到这样的写法:afx_msg LRESULT OnMessageOwn(); Debug 情况下一般不会有任何问题,而当你在Release下且多线程或进程间使用了消息传递时就会导致无效句柄之类的错误。导致这个错误直接原因是消息体的参数没有添加,即应该写成:afx_msg LRESULT OnMessageOwn(WPARAM wparam, LPARAM

lparam); (注2) 3. release模式下不出错,但debug模式下

报错。

这种情况下大多也是因为代码书写不正确引起的,查看MFC 的源码,可以发现好多ASSERT的语句(断言),这个宏只是在debug模式下才有效,那么就清楚了,release版不报错是忽略了错误而不是没有错误,这可能存在很大的隐患,因为是Debug模式下,比较方便调试,好好的检查自己的代码,再此就不多说了。4. ASSERT, VERIFY, TRACE..........调试宏

这种情况很容易解释。举个例子:请在VC下输入ASSERT 然后选中按F12跳到宏定义的地方,这里你就能够发现Debug中ASSERT要执行AfxAssertFailedLine,而Release 下的宏定义却为"#define ASSERT(f) ((void)0) "。所以注意在这些调试宏的语句不要用程序相关变量如i++写操作的语句。VERIFY是个例外,"#define VERIFY(f) ((void)(f)) ",即执行,这里的作用就不多追究了,有兴趣可自己研究:)。总结:

Debug与Release不同的问题在刚开始编写代码时会经常发生,99%是因为你的代码书写错误而导致的,所以不要动不动就说系统问题或编译器问题,努力找找自己的原因才是根本。我从前就常常遇到这情况,经历过一次次的教训后我

就开始注意了,现在我所写过的代码我已经好久没遇到这种问题了。下面是几个避免的方面,即使没有这种问题也应注意一下:1. 注意变量的初始化,尤其是指针变量,数组变量的初始化(很大的情况下另作考虑了)。

2. 自定义消息及其他声明的标准写法

3. 使用调试宏时使用后最好注释掉

4. 尽量使用try - catch(...)

5. 尽量使用模块,不但表达清楚而且方便调试。注1:

afc(afc) 网友提供:

debug版初始化成0xcc是因为0xcc在x86下是一条int 3单步中断指令,这样程序如果跑飞了遇到0xcc就会停下来,这和单片机编程时一般将没用的代码空间填入jmp 0000语句是一样地注2:

不知大家有没有遇到过这种情况,具体原因我也不太清楚,是不是调用时按着默认的参数多分配了

WPARAM+LPARAM的空间而破坏了应用程序的内存空间?还请高手来补充。NightWolf 网友提供:我遇见过,好像是在函数调用的时候参数入栈的问题。因为MFC的消息使用宏写的,所以如果定义了OnMessage()的函数,编译能够通过,但是调用一次后,堆栈指针发生了偏移。然后就。。。

DEBUG调试程序的应用实验的报告.doc

电子电气工程学院学生实验报告 专业级 1 班 2 组姓名学号 课程名DEBUG 调试程序的应用指导教师成绩 一,实验预习 实验序号1实验题目DEBUG调试程序的应用预习日期 要求: 1.实验目的; 2,实验原理; 3,画出实验原理图; 4 实验设备; 5,预习内容(该实验完成的内容);6,记录表格设计 一实验目的 1、了解 DEBUG调试程序常用命令的基本格式、主要功能和使用方法。 2、熟悉进入或退出DEBUG调试程序运行界面的步骤。 3、掌握用DEBUG调试程序进行程序编辑、调试、运行、结果检查的基本方法。 4、进一步汇编语言上机环境及基本操作 二实验原理 1,启动 DEBUG程序,在 DEBUG环境下建立和汇编程序2,输入程序并汇编 A 2,_A 100 169C(CS):0100(ip) MOV DL, 33 ;DEBUG默认 16 进制数 169C: 0102 MOV AH,2 ;dos 的 2 号功能调用 169C: 0104 INT 2l ;功能调用 169C: 0106 INT(中断)20 ;中断 169C: 0108 ;回车结束程序的输入 3.运行程序_G=0100(全速运行)得到 3 4,用反汇编命令_U。然后分析该程序的指令:33 的 ascll 的值为 3, MOV 是将原操 作数送到DL 中( DL 为目标操作数)。 5,将机器指令程序送到起始地址为200H 的若干单元 6,执行机器指令程序_G=0200得到 3 7,执行 T 命令,实现单步运行。 8,执行 D 命令查看存储单元的原值。 E 是修改内存, R 显示修改内存命令。 四实验设备 微型计算机一台

有图示的用DEBUG调试程序过程示例

用DEBUG调试程序示例 例如:编程实现两个字类型的数相加,把和存在存储单元中,并且用debug查看程序的运行结果,检查程序运行结果的正确性。 参考源程序如下: DATA SEGMENT NUM1 DW 1234H NUM2 DW 5678H SUM DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AX,NUM1 ADD AX,NUM2 MOV SUM,AX MOV AH,4CH INT 21H CODE ENDS END START 假设把源程序命名为jiafa.asm,输入源程序后,完成汇编、连接的过程,则生成了可执行文件jiafa.exe。运行此可执行文件时在屏幕上无显示结果。在debug下调试程序的步骤示例如下: 一、进入debug,同时把被调试程序调入内存。 回车后即进入了debug程序,结果如下图所示: 注意:被调试的是可执行文件,而且文件必须写全名,不能只写主文件名。 二、用u命令反汇编(输入u后回车),以便查找需要设置断点的地址。

三、设置断点运行 断点可以设置在程序中的任意一条指令的首地址处,但为了能够查看到程序的运行结果,一般把断点设置在主程序运行完并且程序退出之前,例如程序的最后两条指令是 MOV AH, 4CH INT 21H 则把断点设置在MOV AH, 4CH处,(如果程序较长,一次反汇编没有找到上述指令,再次输入u命令后回车,直到显示上述指令为止,),对于本例,显示如下图所示的结果。 如上图示例中的指令mov ah,4ch的偏移地址是0000F,指令int 21h(debug下默认为16进制,不显示h)的偏移地址是0011,则用G命令设置断点运行时输入g0F(g是debug下的程序运行命令,后面的数字0F是刚才选定的断点地址)回车后结果如下图: 为了能够查看你的程序在内存单元中存放的数据,必须设置断点运行不能只用G命令,并且断点必须是你程序中的某条指令,一般设置在MOV AH, 4CH处。 四、查看内存单元中的数据 查看内存单元的内容用D命令,格式之一如下: D段地址:偏移地址

利用DEBUG调试汇编语言程序段

利用DEBUG调试汇编语言程序段一.实验目的 1.熟悉DEBUG有关命令的使用方法; 2.利用DEBUG掌握有关指令的功能; 3.利用DEBUG运行简单的程序段。 二.实验容 1.进入和退出DEBUG程序; 1)开始—运行,输入cmd,点确定进入命令窗口 2)在命令窗口中输入dubug进入debug程序

3)进入debug窗口后,输入q命令退出debug 2.学会DEBUG中的 1)D命令(显示存数据D 段地址:偏移地址) 例1:-D100 ;显示DS段, 0100开始的128个字节容 说明:指定要显示其容的存区域的起始和结束地址,或起始地址和长度。 ①DSEGREG[起始地址] [L 长度] ;显示SEGREG段中(缺省默认为DS), 以[起始地址] (缺省为当前的偏移地址),开始的[L 长度] (缺省默认为128)个字节的容. ② D SEGREG[段地址:偏移地址]

;显示SEGREG段中(缺省默认为DS), [段地址:偏移地址] 开始的[L 长度] (缺省默认为128)个字节容 -D ;默认段寄存器为DS,当前偏移地址(刚进入debug程序偏移地址为0100H) -D DS:100 ;显示DS段, 0100H开始的128个字节容 -D CS:200 ;显示CS段, 0200H开始的128个字节容 -D 200:100 ;显示DS段, 0200:0100H开始的128个字节容 -D 200;显示DS段, 0200H开始的128个字节容 -D 100 L 10 ;显示DS段, 100H开始的100H个字节容 2)E命令(修改指定存) 例1:-E100 41 42 43 44 48 47 46 45 -D 100,L08

实验一调试程序DEBUG的使用实验报告

南昌理工学院实验报告 二O一二年月日 课程名称:微机原理与接口技术实验名称:调试程序DEBUG的使用班级:姓名:同组人: 指导教师评定:签名: 【一、实验名称】 调试程序DEBUG的使用 【二、实验目的】 1.掌握汇编程序的编辑,编译,连接和执行的全过程; 2.学习和掌握用DEBUG 调试程序的方法。 【三、实验内容和原理】 1.用编辑软件,输入以下汇编语言源程序: DAT SEGMENT A D B 20 ;(自定) B DB 15 ;(自定) Y DB 3 DUP(0) Z DB 0,0 DAT ENDS STA SEGMENT STACK DW 50 DUP(?) STA ENDS COD SEGMENT ASSUME CS:COD,DS:DAT STAR PROC FAR PUSH DS XOR AX,AX PUSH AX MOV AX,DAT MOV DS,AX MOV AX,STA MOV SS,AX MOV AL,A MOV Z,AL MOV Z+1,AL CALL SUB1 MOV AL,B MOV Z,AL MOV Z+1,AL CALL SUB1 MOV AL,A MOV Z,AL MOV AL,B MOV Z+1,AL CALL SUB1 ADD WORD PTR Y,AX ADC BYTE PTR[Y+2],0 RET STAR ENDP SUB1 PROC MOV AL,Z MOV AH,Z+1 MUL AH ADD WORD PTR Y,AX ADC BYTE PTR[Y+2],0 RET SUB1 ENDP COD ENDS END STAR

VB程序调试技巧

一,如果遇到了一些逻辑性很强的问题比如有循环什么的我的方法是在关键地方加入 变量 这样可以比较好地找到问题 二,msgbox 三,监视窗口,如下面的例子 For i=1 to 10000 A=sqr(i) next i 你想再监视当i=799时A的值,就可以添加监视,方法:点调试,添加监视,选择“当监视值为真时中断”,上面表达式框中写上i=799, 这样你按F5,运行程序,程序会在i=799时中断。其他选项你可以自己去琢磨一下。 一个程序如何顺利的“脱产”,调试的过程是非常重要的。学过、钻研过程序设计的人都有同样的感受,很多情况下,调试程序的过程会比程序编写的过程更为困难。任何一个天才都不敢说,他编的程序是100%正确的。几乎每一个稍微复杂一点的程序都必须经过反复的调试、修改,最终才完成。所以说,程序的调试是编程中的一项重要技术。 程序中的典型错误类型 A类:语法错误。 B类:编译错误。

C类:属性设置错误。 D类:逻辑错误。 调试方法 方法一:利用“MSDN帮助菜单” “MSDN帮助菜单”是一个很好的自学工具,对于出现调试对话框的菜单来说,可以按下“帮助”按钮查看错误原因。 对于一些不是很清楚的函数格式、保留字的作用,也可以借助“帮助菜单”。 方法二:逐过程检查 主要检查代码是否写对,位置有没有错误,关键是要确定一段代码是在哪个事件控制下的。 不妨先在脑海中把整个程序过一边,想一想究竟会有哪些事件发生(有些事件是人机互动的,例如:鼠标点击;而有些是机器自己执行的,这时要想到计时器的作用);然后想一想每一件事发生后有什么效果。我们代码所编写的一般就是事件发生后的这个效果,那么以此事件来决定代码所写的位置。

实验一 利用DEBUG调试程序调试程序段

实验一利用DEBUG调试程序调试程序段1.实验目的 (1)熟悉DEBUG有关命令的使用方法。 (2)利用DEBUG掌握有关指令的功能。 (3)利用DEBUG运行简单的程序段。 2.实验内容、实验步骤 (1)进入和退出DEBUG程序。 进入DEBUG程序,Windows中在命令提示符下进入DEBUG如图:退出DEBUG如图: (2)学会DEBUG中的D命令、E命令、R命令、T命令、A命令、G命 令等的使用。对于U命令、N命令、W命令等,也应试一下。 R命令: 1)显示所有寄存器内容: 格式:-R↙ 功能:以十六进制形式显示CPU内部各寄存器的值:以符号形式标志寄存 器各标志位(除TF外)的值,并将CS:IP所指的内存内容反汇编成一条指 令,可视为将要执行的指令。 ●从显示可知,CS=11A7H, IP=0000H. 2)修改寄存器 格式:-R 寄存器名↙ 功能:DEBUG首先显示指定寄存器的当前值,并在下一行首给出提示“:”, 等待用户输入新值,若直接回车相当于不个忙寄存器的值。 ●由显示可知,用E命令修改,再查看可发现数据已经被改了。

3)修改标志值 格式:-RF↙ 功能:先用符号显示当前各标志位的值,并在末尾给出提示符“-”,然后等待用户以符号形式输入新的标志值,对输入的次序没有要求,各标志值之间也可没有空格;若直接在“-”之后回车,则保留原标志值。 ●由显示可知,相应的标志值改变了。 A命令 格式:-A内存地址↙ ●执行汇编命令A后,相应的指令对应的机器码将会依次存放在指定的 内存单元中,并提示下一地址。 U命令 格式:-U 内存块↙

●由显示可知,反汇编命令U从指定的内存地址开始对内存块进行反汇 编,并分三列显示反汇编的结果。 N命令 格式:-N【e】【PA TH】文件名.扩展名↙ W命令L命令 格式:-W/L 内存地址 ●由显示可知,命令N为命令W和命令L指定文件,而命令W把指定 内存块的内容写入命令N指定文件中,命令L则将其文件装入内存地址中。 T命令 1)单步执行 格式:-T=内存地址↙ ●由显示可知,T命令将内存地址的段地址和偏移地址修改CS和IP,然 后执行由CS:IP指向的内存单元处的一条指令,显示各寄存器的值,并反编下一条指令,然后返回DEBUG状态。

PLC程序调试方法及步骤

来源:中国物资采购网时间:2010年5月6日11时20分【大中小】PLC程序的调试可以分为模拟调试和现场调试两个调试过程,在此之前首先对PLC外部接线作仔细检查,这一个环节很重要。外部接线一定要准确无误。也可以用事先编写好的试验程序对外部接线做扫描通电检查来查找接线故障。不过,为了安全考虑,最好将主电路断开。当确认接线无误后再连接主电路,将模拟调试好的程序送入用户存储器进行调试,直到各部分的功能都正常,并能协调一致地完成整体的控制功能为止。 1.程序的模拟调试 将设计好的程序写入PLC后,首先逐条仔细检查,并改正写入时出现的错误。用户程序一般先在实验室模拟调试,实际的输入信号可以用钮子开关和按钮来模拟,各输出量的通/断状态用PLC上有关的发光二极管来显示,一般不用接PLC实际的负载(如接触器、电磁阀等)。可以根据功能表图,在适当的时候用开关或按钮来模拟实际的反馈信号,如限位开关触点的接通和断开。对于顺序控制程序,调试程序的主要任务是检查程序的运行是否符合功能表图的规定,即在某一转换条件实现时,是否发生步的活动状态的正确变化,即该转换所有的前级步是否变为不活动步,所有的后续步是否变为活动步,以及各步被驱动的负载是否发生相应的变化。 在调试时应充分考虑各种可能的情况,对系统各种不同的工作方式、有选择序列的功能表图中的每一条支路、各种可能的进展路线,都应逐一检查,不能遗漏。发现问题后应及时修改梯形图和PLC中的程序,直到在各种可能的情况下输入量与输出量之间的关系完全符合要求。 如果程序中某些定时器或计数器的设定值过大,为了缩短调试时间,可以在调试时将它们减小,模拟调试结束后再写入它们的实际设定值。 在设计和模拟调试程序的同时,可以设计、制作控制台或控制柜,PLC之外的其他硬件的安装、接线工作也可以同时进行。 2.程序的现场调试 完成上述的工作后,将PLC安装在控制现场进行联机总调试,在调试过程中将暴露出系统中可能存在的传感器、执行器和硬接线等方面的问题,以及PLC的外部接线图和梯形图程序设计中的问题,应对出现的问题及时加以解决。如果调试达不到指标要求,则对相应硬件和软件部分作适当调整,通常只需要修改程序就可能达到调整的目的。全部调试通过后,经过一段时间的考验,系统就可以投入实际的运行了。 本文来自: 中国物资采购网https://www.360docs.net/doc/607601586.html, 详细出处参考:https://www.360docs.net/doc/607601586.html,/newsinfo/2010-5-6/201056-11200321719338297.html PLC程序现场调试指在工业现场,甩有设备都安装好后,所有连接线都接好后的实际调试。也是PLC程序的最后调试。现场调试的目的是,调试通过后,可交给用户使用,或试运行。现场调试参与的人员较多,要组织好,要有调试大纲。依大纲,按部就班地一步步推进。开始调试时,设备可先不运转,甚至了不要带电。可随着调试的进展逐步加电、开机、加载,直到按额定条件运转。具体过程大体是: 1)、要查接线、核对地址。要逐点进行,要确保正确无误。可不带电核对,那就是查线,较麻烦。也可带电查,加上信号后,看电控系统的动作情况是否符合设计的目的。 2)、检查模拟量输入输出。看输入输出模块是否正确,工作是否正常。必要时,还可用标准仪器检查输入输出的精度。 3)、检查与测试指示灯。控制面板上如有指示灯,应先对应指示灯的显示进行检查。一方面,查看灯坏了没有,另一方面检查逻辑关系是否正确。指示灯是反映系统工作的一面镜子,先调好它,将对进一步调试提供方便。 4)、检查手动动作及手动控制逻辑关系。完成了以上调试,继而可进行手动动作及手动

DEBUG调试程序 (2)

一、实验目的 1、掌握DEBUG的常用命令,学会使用DEBUG。 2、深入了解数据在存储器中的存取方法,及堆栈中数据的压入和弹出。 3、掌握各种寻址方法以及简单指令的执行过程。 二、实验设备及环境 1.安装Windows 7操作系统的计算机 三、实验内容及步骤(截图并对图示进行必要的文字说明) 1、练习debug的命令 1、汇编命令A(Assemble Command)将汇编语言程序直接会变进入内存 2、反汇编命令U(Unassemble Command)将制定地址范围内的代码以汇编语言 形式显示,同时显示该代码位于内存的地址和机器码

3.显示内存单元内容命令D(Dump Command)显示制定内存范围的内容 显示偏移地址为100-115的内容: 4. 修改存储单元内容命令E(Enter Command) a. 用命令所给定的内容表去代替指定地址范围的内存单元内容。 b. 一个单元一个单元地连续修改单元内容。 例:往200H为起始地址的单元存放一串16进制数。 查看这些数据是否替换了原来单元的内容 5、检查和修改寄存器内容命令R(Register Command) 格式:a. R b. R [寄存器名]

功能:a. 显示CPU所有寄存器的内容和全部标志位状态。 b. 显示和修改一个指定寄存器内容和标志位的状态。 例如:显示所有寄存器的内容和全部标志位状态 例如:修改寄存器BX的内容为3000 例如:修改标志位零ZF为ZR,方向标志DF为DN 6、单步执行命令T(Trace Command) 格式:a. T[=地址] b. T[=地址] [条数] 例:用T命令格式b执行以上程序: 若单步执行3条指令,可采用b格式。 7、运行命令G(Go Command)执行用户正在调试的程序

Keil-C51程序调试过程

如何使用Keil C软件调试单片机程序 调试一般都是在发生错误与意外的情况下使用的。如果程序能正常执行,调试很多时候都是用不上的。所以,最高效率的程序开发还是程序员自己做好规范,而不是指望调试来解决问题。 单片机的程序调试分为两种,一种是使用软件模拟调试,第二种是硬件调试。 使用软件模拟调试,就是用计算机去模拟单片机的指令执行,并虚拟单片机片内资源,从而实现调试的目的。但是软件调试存在一些问题,不可能像真正的单片机运行环境那样执行的指令能在同一个时间完成(往往比单片机慢)。软件调试只能是一种初步的,小型工程的调试,比如一个只有几百上千行的代码的程序,软件调试能很好的完成。 硬件调试其实也需要计算机软件的配合,大致过程是这样的:计算机软件把编译好的程序通过串行口、并行口或者USB口传输到仿真器,然后与单片机一样执行。仿真器仿真全部的单片机资源(所有的单片机接口,并且有真实的引脚输出)。仿真器会将单片机内部内存与时序等情况返回给计算机,这样就可以在计算机里看到单片机程序真实的执行情况。不仅如此,还可以通过计算机的软件实现单步、全速、运行到光标的常规调试手段。仿真器可以接入实际的电路中。 图1:仿真器 下面将具体介绍如何使用Keil uVision 软件来调试单片机程序。 首先:打开一个已经编译通过的单片机项目。选择Debug下面的Start/Stop Debug Session,这个选项可以打开调试也可以关闭调试。

接下来看到的窗口就是调试窗口了: 下面具体说说相关子窗口的功能: 1、左侧的ProjectWorkspace Regs是片内内存的相关情况值;Sys是系统一些累加器、计数器等。Regs

DEBUG的使用及程序调试方法

实验一 DEBUG的使用及程序调试方法 一.实验目的 1、掌握常用DEBUG命令以及调试简单程序。 2、掌握常用汇编指令的功能及其书写格式。 3、掌握在DUBUG下进行简单程序设计并调试。 二.实验环境 微型计算机一台 DOS或WINDOWS操作系统,MASM开发套件。 三.实验原理 DEBUG是专门为汇编语言设计的调试工具软件,它通过单步、设置断点等方式,为使用者提供了非常有效的调试手段。在DEBUG 下所有输入的数据都是十六进制,所以不需要后面加H。并且不区分大、小写字母。 1、直接启动DEBUG程序 如https://www.360docs.net/doc/607601586.html,在C盘的根目录下,启动的方法是: C:\>DEBUG _ 这时屏幕上会出现“_”提示符,等待键入DEBUG命令。 2、启动DEBUG程序的同时装入被调试文件 命令格式如下: C:\>DEBUG [d:][PATH]filename[.EXT] [d:][PATH]是被调试文件所在盘及其路径,filename是被调试文件的文件名,[.EXT]是被调试文件的扩展名。 3、DEBUG的主要命令

(1)检查和修改寄存器内容的命令R,它有三种方式:1)显示CPU内部所有寄存器内容和标志位状态,格式为:-R R命令显示中标志位状态的含义如下表所示: 标志名置位复位溢出Overflow(是/否)OV NV 方向Direction(减量/增量)DN UP 中断Interrupt(允许/屏蔽)EI DI 符号Sign(负/正)NG PL 零Zero(是/否)ZR NZ 辅助进位Auxiliary Carry(是/否)AC NA 奇偶Parity(偶/奇)PE PO 进位Carry(是/否)CY NC 2)显示和修改某个指定寄存器内容,格式为:-R 寄存器名例如输入:-R AX 系统将响应如下: AX F1F4 : 表示AX当前内容为F1F4,此时若不对其作修改,可按ENTER键,否则,输入修改后内容,如: -R BX BX 0369 :059F 则BX内容由0369改为059F 3)显示和修改标志位状态,命令格式为:-RF 系统将给出响应,如 OV DN EI NG ZR AC PE CY- 这时若不作修改可按ENTER键,否则在“-”号之后键入修改值,键入顺序任意。如 OV DN EI NG ZR AC PE CY-PONZDINV (2)显示内存单元内容的命令D,格式为:-D[地址]或-D[范围]

C语言程序调试方法.

所谓程序调试是指对程序的查错和排错。 调试程序一般应经过以下几个步骤: 一、先进行人工检查,即静态检查。 在写好一个程序以后,不要匆匆忙忙上机,而应对程序进行人工检查。这一步十分重要,它能发现程序设计人员由于疏忽而造成的多数错误。这一步往往容易被人忽视,总希望把一切都推给计算机去做,但这样会多占用机器时间,作为一个程序人员应当养成严谨的作风,每一步都要严格把关,不把问题留给后面的工序。 为了更有效地进行人工检查,所编的程序应力求做到以下几点: ①应当采用结构化程序方法编程,以增加可读性; ②尽可能多加注释,以帮助理解每段程序的作用; ③在编写复杂的程序时不要将全部语句都写在main函数中,而要多利用函数,用一个函数来实现一个单独的功能。各函数之间除用参数传递数据外,尽量少出现耦合关系,这样便于分别检查和处理。 二、在人工检查无误后,再上机调试。 通过上机发现错误称为动态检查。在编译时会给出语法错误的信息,调试时可以根据提示信息具体找出程序中出错之处并改正。应当注意的是有时提示出错的地方并不是真正出错的位置,如果在提示出错的行找不到错误的话应当到上一行再找。有时提示出错的类型并非绝对准确,由于出错的情况繁多且各种错误互有关联,因此要善于分析,找出真正的错误,而不要只从字面意义上找出错信息,钻牛角尖。 如果系统提示的出错信息很多,应当从上到下逐一改正。有时显示出一大片出错信息往往使人感到问题严重,无从下手。其实可能只有一二个错误。例如,对使用的变量未定义,编译时就会对所有含该变量的语句发出出错信息。这时只要加上一个变量定义,就所有错误都消除了。 三、在改正语法错误(包括“错误(error)”和“警告(warning)”)后,程序经过连接(link)就得到可执行的目标程序。运行程序,输入程序所需数据,就可得到运行结果。应当对运行结果作分析,看它是否符合要求。有的初学者看到运行结果就认为没问题了,不作认真分析,这是危险的。 有时,数据比较复杂,难以立即判断结果是否正确。可以事先考虑好一批“试验数据”,输入这些数据可以很容易判断结果正确与否。例如解方程ax2+bx+c=0,输入a、b、c的值分别为1、-2、1时,根x的值是1。这是容易判断的,若根不等于1,程序显然有错。但是,用“试验数据”时,程序运行结果正确,还不能保证程序完全正确。因为有可能输入另一组数据时运行结果不对。例如,用公式

用debug调试程序

实验二用DEBUG调试程序 一、实验目的 学习利用DEBUG调试程序的基本思想及方法 二、实验环境: 1.硬件:PC微机 2.软件:DOS系统、EDIT.EXE、MASM.EXE、LINK.EXE、DEBUG.EXE 三、实验内容 利用DEBUG调试程序,可以将一个可执行程序(如.EXE、.COM等)装入内存中,并接管对程序运行的控制权,通过采取如反汇编、断点运行、单步执行、寄存器内容修改等方法,对可执行程序进行跟踪、调试,以找出其中的设计错误,然后再对源程序进行相应修改,重新生成正确的可执行程序。 1.准备被调试程序: 假定所有有关文件均在当前路径C:\MYTEST>下,按照实验一的步骤生成一个被调试的可执行 2.

进入DEBUG环境:(其中斜体部分由键盘输入。) 其中,短线‘-’作为DEBUG环境的操作提示符,在此提示符下,可以输入各种DEBUG 命令,对可执行程序TEST.EXE进行跟踪调试。 3.主要调试命令: 1)反汇编命令U:将存储器中的二进制数据翻译成较有意义的助记符形式,以帮助理 解。一般常用以下格式: a)-U↘:从当前IP处开始,对连续约32字节内容反汇编。如对TEST.EXE,刚装入 DEBUG时的IP=0000,则在输入U命令后有如下显示: 在上例中,12B7:0000表示CS:IP的内容(其中CS的值是动态值);B8B612代表该处存放的二进制数据,亦即指令MOV AX,12B6的机器代码;当连续约32字节的数据反汇编完后,重新回到DEBUG提示符“-”下,如果再键入U命令,则将继续对后面的内存区反汇编。

特别应该注意的是,由于反汇编命令针对内存区的二进制数据,而被调试程序仅占内存区的某一部分,故反汇编出来的内容并非全是被调试程序的代码,如上例中的JMP 0063以后的部分,显然不是TEST.EXE的内容。另外还需注意,DEBUG默认使用十六进制。 b)–U 0123↘:从指定的IP=0123处开始,对连续约32字节内容反汇编。 c)–U 0123 0143↘:从指定的IP=0123处开始反汇编,直至指定的0143处结束。 2)显示寄存器命令R:显示或修改寄存器的内容。一般常用以下形式: a)-R↘:显示所有寄存器当前的内容及当前将执行的指令。如对TEST.EXE,在程序 运行之前,键入R命令: 在显示寄存器内容时,标志寄存器F(或程序状态字寄存器PSW)表示成各个分离的标志位, b)-R AX↘:显示指定的AX寄存器当前的内容,并等待键入新值;如果不作修改, 可直接回车。如: c)-R F↘:显示标志寄存器F各个标志位的内容,并等待键入新的标志位;如果不 作修改,可直接回车。如: 3)运行命令G:使程序在DEBUG控制下运行,一般有全程、断点运行两种方式。 a)-G↘:控制程序由当前IP处运行,直至程序结束。如果当前IP为初始值,其作 用则相当于直接在DOS下运行程序,一般用于快速观察程序的运行情况。 b)-G 0123↘:控制程序由当前IP处运行,直至指定的断点IP=0123H处,程序暂停, 显示各个寄存器的当前值及断点处指令,然后返回DEBUG提示符“-”下。如对 TEST.EXE,若想观察字符串显示的入口参数是否设置好,则可以断点运行至000A 处: 断点一般选取在需要观察的地方,当程序停下来后,可以根据各方面的情况(如寄存器、缓冲区、标志等)来判断程序是否运行正确。

单片机程序调试步骤

步骤: ①首先建立工程项目文件; ②为工程选择目标器件(如TA89S52); ③工程项目设置软硬件调试环境; ④创建源程序文件并输入程序代码; ⑤保存创建的源程序项目文件; ⑥把源程序文件添加到项目中; 第一步:建立工程项目文件 双击桌面Keil uVision3.LNK快捷图标得到图1 KEIL 图标 在打开的下界面中点工程项得到图2。 图1 打开工程下拉菜单,选择点击“新建工程“,首先在这里要新建一个工程项目文件。 图2 为工程文件取一个名称,确定选择存放的路径(事先为每一个工程单独建立一个目录),在建立工程时形成的所有文件全部存放在这个目录下,如起工程名y2(此时不加后缀),保存类型选择 Project Files(*.uv2)点保存

选择新建工 图3 接下来选择CPU驱动芯片,如AT89S52芯片,然后点确定。 图4 这时提示:复制标准的8051开始代码到工程项目文件夹或添加文件到工程项目文件夹?(如果选择Y之后将会产生一个STARTUP文件,对我们实验是一个无用的文件,会在个别计算机上会导致不能创建目标文件,同时会产生一个空白的工程项目文件),选择N之后只建立一个空白的工程项目文件,我们选N便于操作。 至此用户就完成了建立一个空白的工程项目文件,并为工程选好了目标器件,但却是空白的工程项目文件。 第二步:建立源文件 在界面中打开文件下拉菜单,在打开的选项中点“新建”,产生一个新建空白文件。

点新建 图1 在新建空白文件中输入源程序文件 图3 在确认源程序无错时点保存,这时界面上弹出提示“另存为”菜单,选择好保存路径,也就是刚才保存建立工程项目文件的目录路径,输入文件名,如(要有后缀,汇编程序是*.asm),然后点击保存。 图4这时仅仅是完成了汇编程序的建立而已,但汇编程序与工程项目文件现在还没建立任何关系,此时应把源程序文件添加到工程中,构成一个完整的工程项目。 第三步:将源程序文件添加到工程项目中

Debug调试程序的主要命令

Debug调试程序的主要命令 DEBUG..EXE程序(DOS、Windows都提供)是专门为分析、研制和开发汇编语言程序而设计的一种调试工具,具有跟踪程序执行、观察中间运行结果、显示和修改寄存器或存储单元内容等多种功能。也是我们学习汇编语言必须掌握的调试工具,必须熟练掌握其一些的命令的使用。 一、DEBUG程序的启动和退出 1.直接启动 DEBUG..EXE是DOS环境下的可执行程序。在DOS提示符下键入命令:如:C:> DEBUG ↙ 在调用DEBUG程序后,出现“一”提示符,等待使用DEBUG命令。 2.启动DEBUG并装入需要调试的用户程序 命令格式: C:> DEBUG [盘符:][路径][文件名.EXE][参数1][参数2] 二、DEBUG程序的常用命令 1.DEBUG下汇编语言的语法规则 ①所有数值全为十六进制数,且不需要加后缀…H?; ②只能使用DB或DW,直接把字节、字的数值或字符串的ASCⅡ码送入相应单元中;(DD、DQ、DT)是另外三个可以定义变量的. ③不允许使用变量和标号,但变量和标号可用直接地址代替,且直接地址加方括号;START: MOV AX,BX LOOP [1000H] ④短、近和远转移或调用的目标地址,取决于到目标地址的字节位移量。远返回的助记符为RETF。 ⑤修改存储单元字节操作数类型,用BY(BYTE PTR),修改存储单元字操作数类型,用WO(即WORD PTR)。段超越助记符为CS:、DS:、ES:和SS:2.DEBUG的常用命令 (1)汇编命令 A 格式:A [地址] 功能:使用A命令可以直接在Debug中输入汇编指令,输入的汇编语言指令语句从指定的地址单元开始存放。若缺省起始地址,则从当前CS:100地

实验一 DEBUG调试程序的使用

实验一DEBUG调试程序的使用实验 一、实验目的 1.熟悉 DEBUG 调试程序中的常用命令。 2.学会在 DEBUG 下调试运行汇编语言源程序。 二、实验内容 1.熟悉DEBUG常用命令的使用: A、U、D、E、R、G、T、L、W、Q常用命令。2.在DEBUG下编写汇编语言程序,实现多字节(5个字节)十进制加法。 三、实验用设备仪器及材料 硬件:计算机软件:DEBUG调试软件 四.实验方法和步骤 1.在开始菜单\命令提示符下,进入DOS环境。 2.在DOS目录下启动DEBUG。 3.熟悉DEBUG常用命令,详细记录每一步所用的命令及查看结果的方法和具体结果。4.在DEBUG下编写程序,实现多字节十进制加法实验。 五.实验提示 DEBUG常用命令 A:编辑和汇编源程序。格式:-A 地址 U:反汇编验证源程序。格式:-U 地址 R:观察或修改寄存器的内容。 D:显示存储单元的内容。格式:-D 地址 E:修改存储单元的内容。 格式1:-E 地址 格式2:-E 地址单元数据单元数据…… G:设置断点运行源程序。格式:-G=首地址末地址 T:单步执行程序。执行结束后显示 AX、BX、CS、IP 寄存器内容的变化,并显示下一条要执行的指令的地址和内容。 格式:-T=地址或者-T=地址值 N:文件命名。格式:-N *.com L:将某个文件或特定磁盘扇区的内容加载到内存。格式:-L 地址 W:将程序写到磁盘。如果不指定 address,Debug 程序将从 CS:100 开始。在写盘操作之前要用R命令修改bx,cx的内容(存放写的字节数)。

Q:退出 本次实验的内容均在 DEBUG 下完成,实现数据的装入、修改、显示;汇编语言程序段的编辑、汇编和反汇编;程序的运行和结果检查。

C++程序调试方法和技巧

程序调试方法和技巧 一、改正程序的编译期错误 源程序编制完成后,首先由C++编译程序编译成.obj文件,再由连接程序连接成可执行文件。在编译时,如果源程序存在语法错误(errors),则系统不允许连接,直到改正了所有的语法错误后,才能进行连接。另外,编译时还可能存在另一类错误,即警告性错误(warnings),这类错误一般不影响程序的连接,在很多情况下也不影响程序的执行结果,但建议还是尽量把这类错误改正。 选择编译菜单(Compile)(或者直接单击快捷工具栏上的编译按钮)对编译好的源程序进行编译,在集成环境下方的OutPut窗口中将会显示相应的编译信息(若OutPut窗口没有出现,则可以在快捷工具栏上右键单击并在弹出的菜单中选择OutPut菜单项即可打开(或关闭)OutPut窗口)。若程序编译没有发现错误,则该窗口中显示“***.exe - 0 error(s), 0 warning(s)”,这时可以进行程序的连接;若编译后存在语法错误或警告错误,该窗口中则显示两类错误的个数,并列出相应的错误位置和原因。 改正编译期错误的方法和一般原则为: 1.改正错误时一般从第一个错误开始,然后依次改正后续的错误。因为前面错误的出现,往往会导致编译系统在编译时错位,把本来正确的 语句认为是错的,也可能把某些语句的错误掩盖掉。所以当改正了前 面的错误后,可能会使错误量减少很多,也可能增加很多; 2.在OutPut窗口中双击指定错误,则系统会自动定位到该错误出现的位置,并在错误语句前面用一个蓝色子弹头标识。注意,该标识只是告 诉程序员编译时在此位置出错了,真正的错误可能出现在该标识语句 的前一语句或后一语句,如函数定义时,在小括号后加了分号,错误 标识将出现在左大括号处; 3.根据情况,每改正一个或几个错误后,应重新编译一下,然后再从第一个错误进行改错,直到所有错误都被改正过来。 二、程序执行时的调试 实践中发现,往往很小的程序在执行时也会出现错误。当一个程序可以被连接成功,但执行时却存在不正常现象,如不能得到预期的运行结果或出现死机等,而一下子又很难找出出错原因时,可以采取以下方法查错、改错。 1.单步跟踪执行命令

利用DEBUG调试汇编语言程序段

利用DEBUG调试汇编语言程序段

利用DEBUG调试汇编语言程序段 一.实验目的 1.熟悉DEBUG有关命令的使用方法; 2.利用DEBUG掌握有关指令的功能; 3.利用DEBUG运行简单的程序段。 二.实验内容 1.进入和退出DEBUG程序; 1)开始—运行,输入cmd,点确定进入命令窗 口 2)在命令窗口中输入dubug进入debug程序

3)进入debug窗口后,输入q命令退出debug

2.学会DEBUG中的 1)D命令(显示内存数据D 段地址:偏移地址) 例1:-D100 ;显示DS段, 0100开始的128个字节内容 说明:指定要显示其内容的内存区域的起始和结束地址,或起始地址和长度。 ①D SEGREG[起始地址] [L 长度] ;显示SEGREG段中(缺省内默认为DS), 以[起始地址] (缺省内为当前的偏移地址),开始的[L 长度] (缺省内默认为128)个字节的

内容. ②D SEGREG[段地址:偏移地址] ;显示SEGREG段中(缺省内默认为DS), [段地址:偏移地址] 开始的[L 长度] (缺省内默认为128)个字节内容 -D ;默认段寄存器为DS,当前偏移地址(刚进入debug程序偏移地址为0100H) -D DS:100 ;显示DS段, 0100H开始的128个字节内容 -D CS:200 ;显示CS段, 0200H开始的128个字节内容 -D 200:100 ;显示DS段, 0200:0100H

开始的128个字节内容 -D 200;显示DS段, 0200H开始的128个字节内容 -D 100 L 10 ;显示DS段, 100H开始的100H个字节内容 2)E命令(修改指定内存) 例1:-E100 41 42 43 44 48 47 46 45 -D 100,L08 结果:08F1:0100 41 42 43 44 48 47 46 45 例2:-E 100: 08F1:0100 76 42 :42是操作员键入 此命令是将原100号内存内容76修改为42,用D命令可察看。

DEBUG调试程序的使用

DEBUG调试程序的使用 一、DEBUG的启动 在DOS系统提示符下,运行DEBUG命令即可启动。 命令格式:DEBUG [文件名全称] 功能:启动DEBUG调试程序,并把指定名字的文件装载入内存,以供调试。 说明:启动DEBUG,实际就是让计算机执行DEBUG.EXE这个调试程序。若该程序不在当前目录下,需要在命令中指定该程序所在的位置路径(包括其所在磁盘和文件夹)。 文件名全称指定要调试的文件名及其所在的位置路径。若指定该选项,则在启动DEBUG时把该文件装载入内存,以供调试,该文件一般是EXE文件或COM文件。若不指定该选项,则只启动DEBUG,不装载文件。 二、DEBUG常用命令 1、D——显示内存单元内容的命令 格式:D[开始地址[结束地址]] 说明:①若“开始地址”和“结束地址”都指定,则显示指定地址范围内的内存单元的内容;若只指定“开始地址”,省略“结束地址”,则显示从“开始地址”开始的80H个字节的内容;若“开始地址”和“结束地址”都省略,则显示从上次显示的末字节单元的下一个字节开始的80H个字节的内容。 ②“开始地址”可包含段地址,若省略段地址,则默认使用DS的值作段地址。 2、E——输入内容(修改内存单元内容)命令 格式:E开始地址[数据表列] 说明:①若指定数据表列,则用数据表列中的数据存入从指定地址开始的内存单元中;若省略数据表列,则先显示指定开始地址的内存单元的内容,等待你修改。若需要修改,输入其内容,按空格键显示、修改下一个内存单元内容;若不需要修改,直接按空格键显示、修改下一个内存单元内容,修改完成后按回车键。 ②“开始地址”可包含段地址,若省略段地址,则默认使用DS的值作段地址。 3、F——填充内容(修改内存单元内容)命令 格式:F开始地址结束地址数据表列 说明:①用数据表列中的数据存入由开始地址和结束地址指定范围内的内存单元。若数据表列中的数据少于指定地址范围的内存单元数,则循环使用表列中的数据存入内存单元,若数据表列中的数据多于指定地址范围的内存单元数,则多余的数据被忽略。 ②“开始地址”可包含段地址,若省略段地址,则默认使用DS的值作段地址。 4、R——显示和修改寄存器内容命令 格式:R[寄存器名] 说明:省略寄存器名时,显示所有寄存器的内容;当指定寄存器名时,系统先显示指定名字的寄存器的内容,并等待用户输入新的内容,若不需修改,可直接按回车键。用F代表Flags寄存器的名字,即RF命令可显示修改Flags的内容。 5、A——汇编命令 格式:A[开始地址] 说明:①允许用户输入汇编指令(程序段),系统自动把其转变成机器指令,并依次存入指定地址开始的内存单元中。若省略开始地址,则第一次使用A命令时默认开始地址为CS:0100H,以后使用时的默认开始地址为上次用A命令后的下一个内存单元的地址。 ②开始地址一般不指定段地址,默认使用CS的值作段地址。 6、U——反汇编命令

微机实验一 调试程序DEBUG的使用

南昌航空大学实验报告 课程名称:微机原理实验名称: 调试程序DEBUG的使用 班级:09045131 学生姓名:杨望学号:09045131 指导教师评定:签名: 一、实验目的 1、熟悉DEBUG有关命令的使用方法。 2、学习DEBUG掌握有关指令的功能。 3、学习如何使用DEBUG运行简单的程序段。 二、实验内容 1、运行DEBUG,并对一些命令进行操作,例如利用DEBUG验证加法等。 2、利用DEBUG运行一段简单的程序段,例如输出字符串“ABC”。 三、实验步骤: 1、熟悉DEBUG并进行操作 运行CMD,在Windows提示符下输入DEBUG命令进入DEBUG操作,不区分大小写。 (1)格式:-?;屏幕显示DEBUG各项命令提示 C:\DOCUME~1\ADMINI~1>debug -? assemble A [address] compare C range address dump D [range] enter E address [list] fill F range list go G [=address] [addresses] hex H value1 value2 input I port load L [address] [drive] [firstsector] [number] move M range address name N [pathname] [arglist] output O port byte proceed P [=address] [number] quit Q register R [register] search S range list trace T [=address] [value] unassemble U [range] write W [address] [drive] [firstsector] [number] allocate expanded memory XA [#pages] deallocate expanded memory XD [handle]

相关主题
相关文档
最新文档