debug 的使用
DEBUG的使用及调试方法

DEBUG的使用及调试方法调试(debugging)是软件开发过程中一项重要且必不可少的工作。
它是指通过对软件系统进行错误检测、诊断和修正,以确保软件正常运行并满足预期功能。
调试是一个迭代的过程,需要程序员使用一系列的调试工具、技巧和方法来定位和解决问题。
下面我将介绍一些常用的调试工具和技巧,以帮助开发者更高效地进行调试。
1. 打印日志:在代码中插入打印语句,用于输出变量的值、函数的执行信息等。
在调试中通常使用print语句或者日志库(如Python的logging模块)来打印相关信息。
这种方法简单易用,适用于小规模的调试。
2.断点调试:现代集成开发环境(IDE)通常都支持断点调试。
通过在其中一行代码设置断点,程序执行到该行时会停止,然后可以逐步执行代码、检查变量的值,甚至修改变量的值。
IDE还提供了查看变量、调用堆栈、监视表达式等功能,可以帮助开发者更直观地了解程序的执行过程。
3. 单元测试:单元测试是一种对软件组件进行测试的方法,可以自动化地检测代码中的错误和异常情况。
通过编写各种情况的测试用例,开发者可以快速定位问题所在,并修复错误。
常见的单元测试框架有JUnit (Java)和unittest(Python)等。
4. 追踪调试:追踪调试是一种通过记录程序执行的相关信息来分析问题的调试方法。
在追踪调试中,开发者可以记录程序的执行轨迹、函数的调用栈等信息,并根据这些信息来定位问题。
常见的追踪调试工具有DTrace(UNIX/LINUX)、Traceview(Android)等。
5. 内存调试:内存泄漏是一个常见的问题,特别是在C/C++语言中。
内存调试工具可以帮助开发者检测和修复内存泄漏、内存访问错误等问题。
常见的内存调试工具有Valgrind(UNIX/LINUX)、Dr. Memory(Windows)等。
6. 远程调试:当软件运行在远程服务器或者其他设备上时,开发者可以通过远程调试的方式来诊断问题。
实验一DEBUG的使用

实验一 DEBUG 的使用实验目的:1.学习使用.学习使用DEBUG DEBUG DEBUG程序的各种命令。
程序的各种命令。
程序的各种命令。
2.掌握.掌握8088/868088/868088/86指令系统指令系统指令系统---------算数指令。
算数指令。
算数指令。
3.掌握用.掌握用DEBUG DEBUG DEBUG调试自编程序的方法。
调试自编程序的方法。
调试自编程序的方法。
4.掌握.掌握8088/8086 CPU 8088/8086 CPU 寄存器的用途和存储器组织及它们之间的关系。
寄存器的用途和存储器组织及它们之间的关系。
寄存器的用途和存储器组织及它们之间的关系。
5.掌握内存操作数及寻址方法。
.掌握内存操作数及寻址方法。
6.掌握汇编语言伪操作.掌握汇编语言伪操作:BYTE PTR,WORD PTR :BYTE PTR,WORD PTR。
内容及步骤:一、一、DEBUG DEBUG 命令使用命令使用: :1、 敲 DEBUG 进入进入进入 DEBUG DEBUG 环境,显示提示符环境,显示提示符环境,显示提示符 '_ ' '_ '。
2、 用命令用命令 D100 10F D100 10F 观察内存中的观察内存中的161616进制码及屏幕右边的进制码及屏幕右边的进制码及屏幕右边的ASCII ASCII ASCII字符。
字符。
字符。
3、 用命令用命令 E100 30 31 32 E100 30 31 32 ………… 3F 3F 将30H 30H~~3FH 3FH写入地址为写入地址为写入地址为100H 100H 100H开始的内存单元中,开始的内存单元中,再用再用D D 命令观察结果,看键入的命令观察结果,看键入的161616进制数是什么字符的进制数是什么字符的进制数是什么字符的ASCII ASCII ASCII码码?4、 用命令用命令 F100 10F 'A' F100 10F 'A' 将'A''A'的的ASCII ASCII码填入内存,用码填入内存,用码填入内存,用D D 命令查看结果。
debug的使用实验报告

debug的使用实验报告
《Debug的使用实验报告》
在软件开发过程中,debug是一个非常重要的步骤,它可以帮助开发者找到并
修复代码中的错误。
在本次实验中,我们将探讨debug的使用方法以及其在软
件开发中的重要性。
首先,我们需要明确debug的定义。
Debug是一种通过检查、测试和纠正软件
中的错误来确保其正常运行的过程。
在实际应用中,debug通常涉及使用调试
器工具来逐步执行代码并观察其行为,以便找出问题所在。
在本次实验中,我们使用了一个简单的Java程序作为例子来演示debug的使用。
该程序包含了一些常见的错误,如语法错误、逻辑错误和运行时错误。
通过使
用调试器工具,我们逐步执行程序并观察其行为,以便找出并修复这些错误。
在实验过程中,我们发现debug的使用能够极大地提高代码的质量和稳定性。
通过逐步执行程序并观察其行为,我们可以更容易地找出并修复代码中的错误,从而减少了在后期测试阶段发现问题的可能性。
此外,debug还可以帮助我们
更好地理解程序的运行逻辑,从而提高了代码的可读性和可维护性。
总的来说,通过本次实验,我们深刻认识到了debug在软件开发中的重要性。
它不仅可以帮助我们找出并修复代码中的错误,还可以提高代码的质量和稳定性。
因此,在日常的软件开发过程中,我们应该充分利用debug工具,以确保
我们的程序能够正常运行并具有良好的性能。
debug命令的使用

1.打开Windows命令窗口在Windows 95/98的环境中,打开命令窗口的步骤为:点击“开始”→“运行”,输入“command”命令;在WindowsXP及WIN7的环境中,打开命令窗口的步骤为:点击“开始”→“运行”,输入“cmd”命令;2.启动DEBUG在命令窗口中启动DEBUG,启动命令一般为:DEBUG [文件名] [参数表]。
其中:文件名指定被调试的文件,其包括名和后缀,参数表是被调试文件运行时所需要的参数。
被调试的文件可以是系统中的任何文件,但通常它们的后缀为.EXE或.COM。
当DEBUG启动成功后,将显示连接符“-”,这时,可输入各种DEBUG命令。
DEBUG中所有命令及其含义如DEBUG各命令功能说明表所示。
关于使用命令的几点说明:在提示符“-”下才能输入命令,在按“回车”键后,该命令才开始执行命令是单个字母,命令和参数的大小写可混合输入可用F1、F2、F3、Ins、Del、左移键、右移键等编辑键来编辑本行命令当命令出现语法错误时,将在出错位置显示“^ Error”可用Ctrl+C或Ctrl+Break来终止当前命令的执行,还可用Ctrl+S或Ctrl+Num Lock来暂停屏幕显示(当连续不断地显示信息时)以下通过实现十九个示例来熟悉DEBUG的命令集和基本的汇编指令。
R命令的使用R命令作用:观看和修改寄存器的值。
在提示符“-”下输入以下命令:R。
DEBUG将会显示出当前所有寄存器和标志位的状态。
接下来再输入命令RCX。
在提示符“:”后输入100。
该命令的作用是将寄存器CX的值设置为100(注意:DEBUG使用的是十六进制,这里的100相当于十进制的256。
)最后再执行R命令,观看修改后的寄存器值。
H命令的使用H命令作用:计算两个十六进制数的和与差。
在提示符“-”下输入以下命令:H 10 1。
观看命令执行结果。
运行结果的前一个数是计算出来的和,后一个数是计算出来的差。
DEBUG使用方法简介

2.3 DEBUG使用方法简介:DEBUG是DOS命令,必须在DOS环境下运行。
由于目前都使用WINDOWS操作系统,应设法进入实地址模式的DOS环境,才能可靠地运行DEBUG。
一般可用DOS启动盘启动系统,或在WINDOWS-98系统退出时选择“切换到MSDOS”操作,进入到实地址模式的DOS环境。
由于DEBUG是DOS外部命令,因此,须把DEBUG.EXE文件拷贝到当前目录下来运行DEBUG,DOS启动盘中应事先拷贝有DEBUG.EXE文件,在WINDOWS98系统中,“C:\WINDOWS\COMMAND\”目录下有DEBUG.EXE文件。
后面的操作,假设DEBUG.EXE文件都已事先拷贝到当前目录下。
在WINDOWS操作系统中(包括WINDOWS98、2K、XP等),系统提供了V86模式的“命令提示符”窗口,在此窗口中也能运行DEBUG,但DEBUG的某些功能会受到WINDOWS系统的限制。
1.启动与退出DEBUG:启动DEBUG,在DOS提示符下输入:DEBUG[回车]屏幕显示“-”,表示已启动了DEBUG。
“-”是DEBUG子命令等待状态,后面所有的DEBUG操作(包括运行调试自编的汇编语言程序)都是在此“-”提示符下所进行的DEBUG 子命令执行。
退出DEBUG,在“-”提示符下输入:Q[回车]屏幕显示DOS命令提示符:C:\> 或A:\> 。
2.进入与退出输入汇编指令:在“-”提示符下输入:A [偏移地址] [回车]屏幕显示“<段地址>:<偏移地址> |”,此处将等待你输入汇编语言程序或实验指令。
当一条指令输入完毕[回车]后,又将自动出现下一对“<段地址>:<偏移地址> |”等待你输入下条指令,如此重复,将帮助你把整段汇编语言程序输入完毕。
注意:如果输入汇编指令时手误,屏幕上将当场提示错误“ERROE”,自动地址不进步,还在原地址上等待你重新输入正确的汇编指令。
DEBUG和INFO的使用

DEBUG和INFO的使⽤Tomcat下的log⽇志级别1. 等级:DEBUG<INFO<WARN<ERROR<FATAL;2. 区别:2.1 DEBUG,主要⽤于在调试时更详细的了解系统运⾏状态2.2 INFO,重要的输出信息,⽤来反馈系统的当前状态给最终⽤户的;**WARN,ERROR,FATAL,分别是警告、错误、严重错误,这三者是系统运⾏时检测到了⼀个不正常的状态。
**2.3 WARN, 可修复,系统可继续运⾏下去;2.4 ERROR, 可修复性,但⽆法确定系统会正常的⼯作下去;2.5 FATAL, 相当严重,可以肯定这种错误已经⽆法修复,并且如果系统继续运⾏下去的话后果严重。
3. 使⽤:什么时候使⽤ INFO, WARM, ERROR,FATAL?3.1 INFO⽤于打印程序应该出现的正常状态信息,便于追踪定位;3.2 WARM表明系统出现轻微的不合理但不影响运⾏和使⽤;3.3 ERROR表明出现了系统错误和异常,⽆法正常完成⽬标操作。
3.4 FATAL表明出现了⽆法修复的错误,并且如果系统继续运⾏下去的话,必然会越来越乱。
出现FATAL时,采取的最好的措施不是试图将系统状态恢复到正常,⽽是尽可能地保留系统有效数据并停⽌运⾏。
4. ⽰例:/*** <p>Title: ⽤户登录处理</p>* <p>Description: </p>* @param loginId* @return redirect page*/@RequestMapping("/user/login.vw")public String login(HttpServletRequest request, HttpServletResponse response, ModelMap model,@ModelAttribute("login") @Validated CusLogin login,BindingResult bindingResult) throws Exception {log.debug("⽤户登录开始......");// 检查登录信息对象:null判断if (null == login) {log.error("⽤户登录失败-登录信息不存在");bindingResult.addError(new FieldError(ERNOTEXIST[0],ERNOTEXIST[0],ERNOTEXIST[1]));request.getSession().setAttribute(LOGINSTATE, "1");login = new CusLogin();// 1代表登录时⽤户输⼊的信息有误login.setLoginState("1");login.setPasswd("");model.addAttribute("login", login);return INDEX;}// 字段格式检查if (bindingResult.hasErrors()) {List<ObjectError> ers = bindingResult.getAllErrors();for (ObjectError e : ers) {log.error(e.getDefaultMessage());}//has errorlog.error("⽤户登录失败-请求参数错误;username=" + login.getLoginNm());//redirect index.jsprequest.getSession().setAttribute(LOGINSTATE, "1");login.setLoginState("1");login.setPasswd("");model.addAttribute("login", login);return INDEX;}// 第⼀登录失败,再次登录需输⼊验证码,判断验证码是否正确if("1".equals(request.getSession().getAttribute(LOGINSTATE))){if (login.getVerCode() == null || !login.getVerCode().equalsIgnoreCase(VerCodeMaker.verImgGet(session))) { VerCodeMaker.verImgDel(request);log.error("⽤户登录失败-验证码检查失败;username=" + login.getLoginNm());bindingResult.addError(new FieldError(ErrorMsg.VERCODEEROOR[0],ErrorMsg.VERCODEEROOR[0],ErrorMsg.VERCODEEROOR[1]));request.getSession().setAttribute(LOGINSTATE, "1");login.setLoginState("1");login.setPasswd("");model.addAttribute("login", login);return INDEX;}}try {//no error// 获取登录⽤户信息:条件为⽤户名和⽤户类型LoginUsersDto dto = loginService.login(login);if (null == dto || StringUtility.isEmpty(dto.getLoginName())) {bindingResult.addError(new FieldError(ERNOTEXIST[0],ERNOTEXIST[0],ERNOTEXIST[1]));log.error("⽤户登录-查询⽤户信息失败,不存在或DB数据错误;username=" + login.getLoginNm());request.getSession().setAttribute(LOGINSTATE, "1");login.setLoginState("1");login.setPasswd("");model.addAttribute("login", login);return INDEX;}// 密码检查boolean isPwdExist = loginService.passwordChk( dto.getLoginName(), login.getPasswd(), dto.getPassword()); if (!isPwdExist) {bindingResult.addError(new FieldError(ErrorMsg.PWDERROR[0],ErrorMsg.PWDERROR[0],ErrorMsg.PWDERROR[1]));request.getSession().setAttribute(LOGINSTATE, "1");login.setLoginState("1");login.setPasswd("");model.addAttribute("login", login);log.error("⽤户登录-密码检查失败;username=" + login.getLoginNm());return INDEX;}// 获取⽤户认证及⽀付信息PayAuthInfoDto payInfoDto = payService.getPayAuthInfoByCusCode(dto.getCusCode());// 创建SESSION数据User user = new User();if (null != payInfoDto) {user = erSet(dto , payInfoDto);} else {user = erSet(dto);}UserSession.setUser(request, user);log.debug("⽤户登录结束");} catch (BizException e) {("⽤户登录失败;username=" + login.getLoginNm(),e);bindingResult.addError(new FieldError(ErrorMsg.UNKNOWEXPCTION[0],ErrorMsg.UNKNOWEXPCTION[0],ErrorMsg.UNKNOWEXPCTION[1]));login.setPasswd("");model.addAttribute("login", login);return INDEX;} catch (Exception e) {("⽤户登录失败,username=" + login.getLoginNm(),e);bindingResult.addError(new FieldError(ErrorMsg.UNKNOWEXPCTION[0],ErrorMsg.UNKNOWEXPCTION[0],ErrorMsg.UNKNOWEXPCTION[1]));login.setPasswd("");model.addAttribute("login", login);return INDEX;} finally{request.getSession().removeAttribute(LOGINSTATE);}return REUSERINDEX;}5. 排查步骤:5.1 打开Tomcat⽂件中的logs⽂件夹,然后打开需要查找的⽂件,debug.log、info.log、error.log等;5.2 其中,每个⽇志⽂件是由时间和⼤⼩规则⽣成的;5.3 如⼀个项⽬的debug.log⽂件,是2019/7/10 11:48:00创建的,假设14:00,⽂件装满,⽐如说40M,那么就会保存为debug.log.1,并再⽣成⼀个debug.log⽂件以此类推;5.4 debug.log.1⽂件记录了11:48:00到14:00的⽇志信息;5.5 如打开debug.log⽂件,CTRL+F输⼊查找⽬标进⾏搜索定位;5.6 明确错误现象 -> 错误关键描述 -> 最终的错误原因。
DEBUG的使用方法

DEBUG的使用方法1.设置断点:断点是在代码中设置的一个位置,程序在运行到这个位置时会暂停执行。
可以在关键的代码行上设置断点,以便在程序运行到这些位置时进行观察和调试。
在DEBUG工具中,我们可以在代码行上单击左侧的空白区域来设置断点。
2.执行步进:步进是一种按步执行程序的方法,可以逐行或逐过程执行代码。
通过逐行执行代码,可以观察每一行代码的执行情况,以便找出程序中的错误。
可以使用DEBUG工具提供的步进功能,一次执行一行代码或一个过程。
3.观察变量:在程序运行过程中,可以观察和监视变量的值,以便了解程序的状态。
可以使用DEBUG工具来查看变量的值,并在程序执行过程中跟踪变量的变化。
这对于发现变量值的改变和问题的根源非常有帮助。
4.输出调试信息:在调试过程中,可以通过在代码中插入输出语句来输出调试信息。
可以使用DEBUG工具提供的输出窗口或控制台来查看这些调试信息。
输出调试信息有助于了解程序的执行流程,找到错误发生的原因。
5.检查堆栈:堆栈是保存程序执行状态的一种数据结构,可以在DEBUG工具中查看和跟踪堆栈的状态。
堆栈信息可以告诉我们程序的执行路径,以及代码是如何调用和返回的。
通过检查堆栈,我们可以找到错误发生的上下文和调用链。
6.使用断言:断言是一种在代码中插入的条件,用于检查程序执行过程中的假设和要求。
可以使用DEBUG工具中的断言功能,在关键的代码位置插入断言条件。
当断言条件不满足时,程序会执行中断操作,从而帮助我们快速定位错误。
7.进行追踪:追踪是一种记录程序执行过程的方法,可以在DEBUG工具中查看程序的执行轨迹。
追踪记录了程序的每一步操作,包括函数调用、条件语句的执行和变量的修改等。
通过追踪,我们可以逐步了解程序的执行情况,并找到错误所在。
8.使用条件断点:条件断点是一种在特定条件下触发断点的方法。
可以在DEBUG工具中设置条件断点,当满足特定条件时,程序会在断点处暂停执行。
条件断点可以帮助我们找出特定情况下的错误,提高调试的效率。
实验一 DEBUG的使用

源程序:MOV AL,30H
MOV BL,26H
ADD AL,BL
PUSH AX
POP DX
MOV AH,02H
INT常用指令练习
1、传送指令
1)用A命令在内存100H处键入下列内容:
0AF4:0108 int 21
0AF4:010Amov dl,43
0AF4:010Cint 21
0AF4:010E int 20
0AF4:0110
-r
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0AF4 ES=0AF4 SS=0AF4 CS=0AF4 IP=0100 NV UP EI PL NZ NA PO NC
:0206 CD20 INT 20H ;结束
步骤:a.用E命令将目标代码写入内存CS:0200H~0207H
—E DS:200 B2,33,B4,02,CD,21,CD,20
b.用G命令从200H开始执行。
—G=CS:200
屏幕显示:
3
Program terminated normally.
—
c.用U命令反汇编
(2)用键盘,将AX,BX,CX,DX及DS,ES清0。
2.简单程序的执行:
(1)用E命令输入一段程序并执行,其源程序,目标代码及地址分配如下:
CS:0200 B233 MOV DL,33H ;将十六进制数‘33’存入DL中
:0202 B402 MOV AH,02H ;DOS2号功能调用
:0204 CD21 INT 21H ;屏幕显示DL内容
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Debug是一种程序调试工具,主要用于帮助程序员检查和修复程序中的错误。
以下是如何使用Debug的基本步骤:
设置断点:断点是一种标记,告诉Debug从标记的地方开始查看。
在要设置断点的代码行上单击鼠标左键即可。
运行程序:在代码区域右击,选择Debug执行。
单步执行:点击Step Into(F7)这个箭头,或者直接按F7,以一行一行地操纵代码,从而判断程序的执行流程是否与预期一致。
查看变量值:在执行过程中,可以查看变量的当前值,以了解程序状态。
删除或禁用断点:选择要删除的断点,单击鼠标左键即可。
如果是多个断点,可以每一个再点击一次。
也可以一次性全部删除。
以上是使用Debug的基本步骤,但请注意,具体使用方式可能会根据Debug的具体版本和配置有所不同。