如何调试程序及调试程序基本步骤、方法详解_程序调试过程-程序员宅基地

技术标签: 调试  后端  

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],就是进入调用方法的内部,接下在单步执行,一句一句的检查程序的执行情况。

  1. 强制进入内部[force step into Alt+shifit+F7]

4)跳出内部 [step out shift+F8] 就是跳出方法。
idea中的调试按钮
idea调试模式

eclipse的debug调试功能

1)进入内部[step into F5]

  1. 向下单步执行 [step over F6]

3)跳出内部 [step return F7]
eclipse中的调试按钮

日志控制台的输出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脚本调试
js 脚本调试
html及css调试
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_32719215/article/details/94479385

智能推荐

macos mojave_如何在macOS Mojave中启用暗模式-程序员宅基地

文章浏览阅读245次。macos mojaveMacOS Mojave brought with it a slew of new features, the most striking of which is a system-wide dark mode that applies to all native Apple apps and compliments Apple’s Night Shift to ease..._macos夜间模式太灰色

ubuntu 16.04 + ROS kinetic 安装Kinect v1驱动_ros16下安装kinectv1驱动-程序员宅基地

文章浏览阅读2.7k次。openni、Sensor、NITE(可选)这三个包的版本必须匹配才能正常运行主要参考①https://www.20papercups.net/programming/kinect-on-ubuntu-with-openni/②https://blog.csdn.net/u011092188/article/details/54861591③https://blog.csdn.ne..._ros16下安装kinectv1驱动

2020最新版Python学习路线图--Python框架与项目重点知识_传智博客2020 python-程序员宅基地

文章浏览阅读1.3k次。Python学习路线图的Python框架部分有Django框架和Flask框架,学完这部分Python框架就可以去找Web全栈工程师工作,独立开发前端和后端业务。Python学习路线图的Django框架部分需要掌握Web主流框架-Django的使用;可根据Web框架设计,开发对应的数据库;可根据业务流程图,开发Web网站的前后台业务。黑马程序员Python学习路线图的Flask框架部分需要掌握W..._传智博客2020 python

HOJ Megaminx-程序员宅基地

文章浏览阅读705次。MegaminxMy Tags (Edit) Source : fishcanfly Time limit : 1 sec Memory limit : 64 MSubmitted : 59, Accepted : 47M_hoj

snapchat注册不到_从Snapchat获得开发人员职位中学到的经验教训-程序员宅基地

文章浏览阅读144次。snapchat注册不到Here are three links worth your time: 这是三个值得您花费时间的链接: I just got a developer job at Snapchat. Here’s what I learned and how it can help you with your job search (15 minute read) 我刚刚在Snapc..._type in snapchat search

鸟哥的LINUX私房菜第二章 学习笔记-程序员宅基地

文章浏览阅读218次。0.2.1多核CPU是指在一颗CPU封装当中嵌入了两个及以上的运算核心不同的CPU型号大多有不同的脚位,更换CPU时要注意能否与主板相配频率是指CPU每秒钟可以进行的工作次数但注意,不同的CPU之间不能单纯以频率判断运算效能 早期的CPU构架主要通过北桥来链接系统最重要的CPU,主存储器与相关适配器设置;由于所有设备通过北桥连接,所以每个设备的工作频率都应该相同;但

随便推点

离散数学大作业_离散数学实验大作业-程序员宅基地

文章浏览阅读932次,点赞19次,收藏22次。1.作业要求2.题目选择命题公式的真值表用户输入一个命题公式,输出该公式对应的真值表。例如:输入(p ∨ q) → ¬r,输出:题目描述关于为什么选择了这个题目,最后会提到 。3.所需解决的关键问题4.代码使用Python完成注释已经给出。import itertoolsfrom tabulate import tabulate # 导入 tabulate 用于美化表格格式# 处理蕴含操作的函数def handle_imp_离散数学实验大作业

查看wpar的配置信息_基于FC适配器的WPAR创建和Oracle数据库配置-程序员宅基地

文章浏览阅读65次。存档日期:2019年5月13日 | 首次发布:2012年9月12日 工作负载分区(WPAR)是IBMAIX6.1和更高版本随附的许可程序产品。 本文介绍了导出了光纤通道(FC)的WPAR的概念和配置。 此外,它还描述了在WPAR内安装和配置Oracle数据库和Oracle自动压力测试(OAST)工作负载的步骤。 此内容不再被更新或维护。 全文以PDF格式“按原样”提供。 随着技术的..._fc适配器存储配置

outlook收邮件延迟_如何计划或延迟在Outlook中发送电子邮件-程序员宅基地

文章浏览阅读5.7k次。outlook收邮件延迟When you click Send on an email, it is typically sent immediately. Butwhat if you want to send it at a later time? Outlook allows you delay the sending of a single message or all email me..._outlook delay delivery

jQuery中attr的用法_jq attr用法-程序员宅基地

文章浏览阅读7.4k次,点赞13次,收藏44次。attr用来获取属性,prop获取特性Jquery1.6之后,可以通过attr方法去获得属性,通过prop方法去获得特性属性指的是“name,id”等等,特性指的是“selectedIndex, tagName, nodeName”jquery判断checked的三种方法:.attr('checked'): //看版本1.5-返回:true或false.prop('checked')..._jq attr用法

feed_如何自定义Google Feed(并使之真正有用)-程序员宅基地

文章浏览阅读1.2k次。feedWhen Google first released Google Now, it was celebrated by Android users across the board. When Now evolved into the Google Feed, however, this change was much less accepted. But the Feed is grea..._feed ang grow怎么自定义

meteor构建app程序_在Meteor.js中构建Slack克隆:实时数据-程序员宅基地

文章浏览阅读267次。meteor构建app程序This is the second of a five-part series on building a Slack clone using Meteor. The aim of these tutorials are not just for you to blindly follow instructions, but it's our hope that you...