如何调试程序及调试程序基本步骤、方法详解
1.为什么要进行程序调试及调试程序的目的?
程序调试是将编制的程序投入实际运行前,用手工或 编译程序等方法进行测试,修正语法错误和逻辑错误的过程。这是保证计算机信息系统正确性的必不可少的步骤。
测试时程序运行错误,无法根据提示的错误信息准确定位错误原因及错误位置。
根据测试时所发现的错误信息和利用调试工具追踪的提示信息,两者相互结合综合判断错误发生原因和位置。找出错误原因和具体的错误位置*,最终方便进行修正。
测试本身也就属于程序调试的过程中的一部分。
调试是验证程序的运行是否符合自己的设计。
2.调试的原则
一、用头脑去分析思考与错误征兆有关的提示信息。
二、避开死胡同。同一个问题验证完成,办法行不通。这样需要换种思路处理问题。
三、只把调试工具当做查找错误位置及错误原因的手段。利用调试工具,理清楚程序中数据流转逻辑,可以帮助思考,但不能代替思考,因为调试工具只是辅助性的定位错误的方法。而解决实际问题需要根据调试的提示信息,自己判断思考出正确的处理方式。
四、避免用试探法,最多只能把它当做最后手段。
五、修改错误的一个常见失误是只修改了这个错误的征兆或这个错误的表现,而没有修改错误本身。如果提出的修改不能解释与这个错误有关的全部线索,那就表明只修改了错误的一部分。要找到问题的根源。思考为什么会引起这样的错误,是否是设计上就出现不合理的问题。
3.调试程序的思想
首先要了解清楚系统功能的业务,业务了解清楚后,根据业务功能进行测试来使业务数据流转(业务产生数据,数据体现业务)。
当错误发生时,首先应该想到并且知道这个问题的产生所依赖的业务数据流程。
比如:当点击表单提后出现错误。这时应该思考点击提交按钮后应该发生了哪些些数据流转过程:点击提交按钮后,这个按钮触发的是提交form表单的action 指向的是控制层的哪个方法或js脚本中的某个function, 下来就是控制程方法接收数据后又调用的时service的哪个方法,继续直到到后台调用的是哪个数据库的sql再就是返回值返回页面数据的过程。
在这个过程中业务数据跟着业务程序逻辑在流转。再根据页面展现的错误现象及报错提示信息,推测该错误可能会发生在这个业务数据流转过程中的哪个位置,从而确定我们调试的断点位置。调试,找出错误原因,提出解决方案,解决后再次测试。
4.程序调试步骤方法
1)根据错误提示信息及业务功能逻辑的推理等相关信息【与错误征兆有关的提示信息】找到有可能会导致错误发生的位置
异常错误日志信息定位错误发生位置
日志信息的输出位置一是控制台输出,这时最及时的一种方式,在程序运行时可以很容易就看到日志输出信息。二是输出日志信息到日志文件中,这种方式根据项目要求配置日志相关信息[日志输出级别、日志输出路径]
这些日志信息分为以下几种
【1】系统程序代码中自己标记的日志信息
错误日志
当程序执行发生错误时,在日志文件或控制台输出时就会输出到已标记的日志信息,根据输出的已标记信息通过工具搜索定位到具体的打印日志的方法。
【2】 错误信息没有我们标记的日志,而是在程序执行中发生错误导致的异常错误信息提示如下:
1》2019-07-01-13-05 [http-nio-192.168.200.169-8443-exec-1] [org.thymeleaf.TemplateEngine] [ERROR] - [THYMELEAF][http-nio-192.168.200.169-8443-exec-1] Exception processing template "findFlpcList": An error happened during template parsing (template: "class path resource [templates/findFlpcList.html]")
org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates/findFlpcList.html]")
2》Caused by: org.attoparser.ParseException: Exception evaluating SpringEL expression: "#strings.substring(flpcDTO.createTime,0,10)" (template: "findFlpcList" - line 27, col 25)
3》Caused by: org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression: "#strings.substring(flpcDTO.createTime,0,10)" (template: "findFlpcList" - line 27, col 25)
4》Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: 10这种在日志文件或控制台中输出的异常错误信息,我们看日志错误信息按照这种思路1》中表示了错误发生的位置,比如:
An error happened during template parsing (template: "class path resource [templates/findFlpcList.html
可以推测出发生错误的地方应该templates/findFlpcList.html文件中,原因是An error happened during template parsing模板解析时出错。在调试排查错误位置点时重点就可以在代码中的查找findFlpcList.html文件。2》、3》、4》的 Caused by中就显示了错误造成的原因。比如:Exception evaluating SpringEL expression: "#strings.substring(flpcDTO.createTime,0,10)" (template: "findFlpcList" - line 27, col 25)就显示了在模版findFlpcList 的27行 "#strings.substring(flpcDTO.createTime,0,10)"发生 SpringEL expression异常
紧接着看下一句
Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: 10
可以看出错误原因就是字符索引越界了,这样我们就可以推测可能为flpcDTO.createTime 取值有问题或者(0,10)截取不对。下来要做的就是 将flpcDTO.createTime 的值打印输出 查看具体值是什么,判断错误发生原因。这一步就是下面的调试。
2.1)在IDE中进行启动debug调试模式,进行***标记断点***”“ 。注意:一般打断点的方式及位置是
【1】在有可能发生错误的方法的第一行逻辑程序打程序断点。
【2】方法中最有可能发生错误的那一行打程序断点。
【3】在程序运行到断点位置暂停时,进行下一步调试,这时需要特别***注意观察***程序运行的每一步的数据是否为业务流程处理的正确数据。
2.2)打印输出相关信息 ->system.out.println()
【1】打印信息在方法中最有可能发生错误的那一行上一行或下一行,将程序执行的参数、返回结果值在控制台进行输出,检查输出的结果值是否为程序执行咱们想要的结果,进而判断错误发生点。
【2】这种打印输出信息的方法也是在某些不支持debug的系统调试的一个重要方法。
3)在打断点和标记打印输出后,现在开始进行debug模式调试。
当程序运行到断点,这时程序在一个暂停状态,我们需要进行程序单步向下执行,观察每一步中的输入参数数据是否正确或调用方法的返回值数据是否正确,当程序运行到一个方法时我们可以继续单步向下执行不管方法内部的逻辑只关心返回值,也可以使用程序调试方法中的进入方法内部继续追踪程序(进入方法内部后继续单步执行或跳出方法内部),直到程序执行发生错误,判断是否为程序错误发生的实际位置。
另一种情况当程序运行起来后,业务处理发生错误,并没有进入我们的断点或打印输出语句,这时就是我们推测的程序发生的位置不对,需要根据错误信息和业务处理流程逻辑重新推测错误发生位置,重新再次进行第2步。
4)当查找问题时注意将问题细化拆解,看看一个大问题中,程序正确执行到哪一步,精确定位错误点。
5.1后台调试工具
调试的主要方法,(1)单步走 (2)进入方法内部(3)跳出方法,不管在那个工具中应该都有这样的功能,只是这些功能的快捷键不同。下面介绍几种工具
idea的debug调试功能
1)向下单步执行 [step over F8] ,就是程序一句一句的执行。
2)进入内部[step into F7],就是进入调用方法的内部,接下在单步执行,一句一句的检查程序的执行情况。
- 强制进入内部[force step into Alt+shifit+F7]
4)跳出内部 [step out shift+F8] 就是跳出方法。
eclipse的debug调试功能
1)进入内部[step into F5]
- 向下单步执行 [step over F6]
3)跳出内部 [step return F7]
日志控制台的输出logger.error()、logger.info(),根据日志信息提示,寻找问题出错的位置及出错原因。常说一句话“看日志或控制台有没有报错输出。“
自己指定的system.out.println() 的打印输出,这种方式是在自己根据预测的错误点的位置进行打印相关信息,进而验证和查看自己对错误原因及错误位置的定位。
模拟浏览器发送请求的工具 有: Postman、curl
5.2.前台浏览器调试工具方法
和后端调试工具应具有的调试功能相似,
在chrome,fireFox、ie、qq、360、浏览器中的调试快捷键通常都为 F12
按下F12快捷键进入调试模式,浏览器的调试目标 针对 js 、html、css 样式。
打印输出 console.log()、弹出信息方式alert()。
js脚本调试
html及css调试
如何调试程序及调试程序基本步骤、方法详解相关推荐
- msu文件无法运行_msu文件怎么安装,msu文件安装步骤方法详解
Win10更新的安装默认都是自动进行,不过有时候我们也会遇到安装失败等问题,这时候可能就需要手动安装来解决.对于Windows10离线更新包来说,格式一般是MSU,这个格式该怎么装呢?另外还有CAB格 ...
- TIA博途_PROFINET设备名称的分配方法详解和无介质设备更换具体步骤
TIA博途_PROFINET设备名称的分配方法详解和无介质设备更换具体步骤 基于工业以太网的PROFINET通信模型 如下图所示, 由上图可以看到,PROFINET在应用层定义的过程数据,没有经过传输 ...
- bom event周期_MRP运行五大步骤逻辑详解(含动态安全库存、安全时间、批量计算方法、BOM表扩展方法的详细说明)...
MRP运行五大步骤逻辑详解(含动态安全库存.安全时间.批量计算方法.BOM表扩展方法的详细说明) 作者:袁云飞(AlbertYuan)- 微信号yuanalbert 以下内容均为原创,希望对初学者有一 ...
- java用redis缓存的步骤_详解在Java程序中运用Redis缓存对象的方法|chu
这段时间一直有人问如何在Redis中缓存Java中的List 集合数据,其实很简单,常用的方式有两种: 1. 利用序列化,把对象序列化成二进制格式,Redis 提供了 相关API方法存储二进制,取数据 ...
- 3721病毒杀除方法详解
FROM CHINAUNIX.NET 这篇文章本来是偶的投稿,因故未能发表,近日看到有朋友提到升xp到sp2,必须先删除掉xp的上网助手,因此想起此文,特此发出,欢迎转载,请注明原作者是俺就行咯 == ...
- python语言的格式框架_django框架模板语言使用方法详解
本文实例讲述了django框架模板语言使用方法.分享给大家供大家参考,具体如下: 模板功能 作用:生成html界面内容,模版致力于界面如何显示,而不是程序逻辑.模板不仅仅是一个html文件,还包括了页 ...
- python的装饰器迭代器与生成器_python3 装饰器、列表生成器、迭代器、内置方法详解等(第四周)...
前言: 为什么要学习python3? 原因: 1.学习一门语言能力 2.通过该语言能力完成测试自动化以及独立完成自测框架知识 那么我要做什么呢? 1.每天花十个小时完成python3的学习 要在什么地 ...
- php调用C代码的方法详解和zend_parse_parameters函数详解
来源:http://my.oschina.net/Customs/blog/490873 http://blog.csdn.net/super_ufo/article/details/3863731 ...
- mysql master 配置_MySQL双Master配置的方法详解
刚刚抽空做了一下MYSQL 的主主同步.把步骤写下来,至于会出现的什么问题,以后随时更新.这里我同步的数据库是TEST1.环境描述.主机:192.168.0.231(A)主机:192.168.0.23 ...
- python输入数据爬取_python根据用户需求输入想爬取的内容及页数爬取图片方法详解...
本次小编向大家介绍的是根据用户的需求输入想爬取的内容及页数. 主要步骤: 1.提示用户输入爬取的内容及页码. 2.根据用户输入,获取网址列表. 3.模拟浏览器向服务器发送请求,获取响应. 4.利用xp ...
最新文章
- grep 的特殊使用
- Apche Httpd安装与配置
- 常考数据结构与算法:二叉树的之字形层序遍历
- 为什么你投出去的简历,都石沉大海了?
- 【小白学习C++ 教程】七、在C++指针声明和指针相关概念
- 十一、深入JavaScript的定时器(七)
- android 打印机蜂鸣器,CANON喷墨打印机 蜂鸣器响5声不打印的问题解决办法
- 2.3.2. 进程互斥的软件实现方法
- linux强制移除pdf密码,分享|如何在 Linux 中从一个 PDF 文件中移除密码
- 深度学习笔记(38) 非极大值抑制
- win上部署基于openvino2020.2的yolov5算法
- PHP+Mysql+jQuery找回密码
- DNS是什么?工作原理、工作流程总结
- Mycat分库分表优缺点分析
- python打招呼的代码_GitHub - worry45678/LearnPython: 以撸代码的形式学习Python
- 2.Collection、Iterator迭代器、泛型、斗地主案例
- 一款基于安卓的观看漫画的app,有漫画排行榜、漫画目录、收藏夹、历史记录、漫画搜索、更新推送服务等
- 韩松手机摄影笔记第三课--经营画面的原则
- cgb2110-day10
- 计蒜客蓝桥杯模拟赛5 年龄问题