软件调试技术包括
1,分析推理;
设计人员和开发人员根据软件缺陷的信息对软件进行分析、推理和调试。
根据软件程序架构从上到下缩小定位范围,确定可能出现问题的软件组件。
根据软件功能,软件运行时序定位软件问题。
根据算法原理,分析并确定了缺陷问题的根源。
2.归纳类比;
归纳法是一种从特殊推理中得出的系统思维方法。归纳调试的基本思想是从一些线索(错误症状)入手,通过分析它们之间的关系找出错误。这种方法主要是根据积累的工作经验和案例来处理调试工作。
根据工作经验和处理程序设计中类似问题的方式,进行调试工作。
咨询相关部门和有经验的人员。
查找相关文献和案例,提供处理问题的思路和方法。在软件开发过程中,通常会对每一个缺陷问题进行跟踪管理,并详细记录解决问题的方案和过程。
收集错误的信息,列出数据,包括输入,输出,归纳,发现规律,从线索中划分,找到线索之间的联系。也就是说:从特殊到一般。
3、追踪回朔;
小程序常用的一种有效的调试方法,一旦发现错误,人们首先分析错误的症状,确定最先发现“症状”的位置,然后沿着程序的控制流人工追溯源代码,直到找到错误的源头或确定错误的范围。
例如,在程序中发现的错误是一个打印的语句,此时程序变量的值可以从输出值中推断出来。从这一点出发,我们可以追溯程序的执行过程,反复思考:“如果程序在这一点的状态(变量的值)是这样的,那么程序在前一点的状态一定是这样的……”直到发现错误。
软件开发通常采用基线和版本管理。基线为程序代码开发提供了统一的开发基础,基线的建立有助于区分各个阶段存在的问题,定位缺陷。软件版本在软件产品开发过程中生成版本树。一个软件产品其实就是某个软件版本,新产品的开发通常是基于某个软件版本。
如果在开发过程中发现问题,可以回到版本树中的稳定版本,找到问题的根源。
通过基线版本序列,可以跟踪产品的各种问题,基于某个版本重新建立配置,重现软件开发过程中的软件缺陷和各种问题,定位并找到问题的根源。
4.增量调试;
软件开发大多采用软件配置管理和持续集成技术。开发人员每天向版本库提交评估代码。持续集成者完成集成构建工作。
通过控制持续集成的粒度(构建时间间隔),可以控制开发人员提交给版本库的程序代码量,从而便于定位缺陷。
通常每天晚上都会进行持续的整合工作。发现问题的时候,开发者其实只需要调试和处理当天写的代码就可以了。
5.写出能重现问题的最短代码;
利用程序切片和插桩技术编写了能重现问题的最短代码调试软件模块。
程序切片程序切片是通过剔除特定位置所有不影响表达式计算的语句,将程序缩减到最小形式,仍然产生给定的行为。
使用切片技术,可以将一个大型复杂的软件模块转化为多个切片程序。这些切片程序比原始程序更简单,更容易调试和测试。
程序插装的方法是在被测程序中插入一些语句或程序段,以获得各种信息。通过这些信息,我们可以进一步了解程序在执行过程中的一些动态特征。一个软件构件的独立调试和测试需要采用插桩技术,构件的调用或运行需要桩模块。在软件模块的调试过程中,程序切片和程序插装可以一起使用。
6.日志跟踪技术;
日志是一种记录机制。在软件模块不断集成和构建的过程中,日志文件记录了有用的信息。如果构建失败,通过查看日志文件将信息反馈给相关人员进行软件调试。
7、调试和测试技术;
测试驱动开发。
测试驱动开发是一种不同于传统软件开发过程的开发方法。在写一个功能的代码之前,先写测试代码,再写通过测试的功能代码,这样有助于写出简洁、可用、高质量的代码。
开发和测试的集成。
除了编程代码和白盒测试,程序开发人员还应该完成基本的功能测试设计和实现。这将有助于程序开发人员更好地进行调试工作。
程序开发人员可以通过交叉测试解决测试心理的问题(他们自己测试不了)。使用这种模式,测试人员的数量会减少,专业测试人员会去做其他复杂的测试工作。
R&D的很多低级缺陷都会在开发过程中尽早发现,从而降低后期发现缺陷的成本。
8.强制调试;
目前普遍采用这种调试方式,效率较低。不需要太多思考,省脑子。例如:
通过打印所有内存进行调试,在这一大堆数据中寻找错误的位置。
在程序的特定位置设置打印语句,在出错的源程序的关键变量变化位置、重要分支位置、子程序调用位置插入打印语句,跟踪程序的执行,监视重要变量的变化。
自动调用工具,利用一些编程语言的调试功能或者专门的交互式调试工具,在不修改程序的情况下,分析程序的动态过程。
在应用上述任何一种方法之前,我们都应该对错误的症状进行全面彻底的分析,对错误的位置和性质进行猜测,然后使用适当的调试方法来检验猜测的正确性。
9、演绎调试;
演绎法是一种从一般原理或前提出发,经过排除、本质的过程,推导出结论的思维方法。演绎调试是指测试人员首先根据已有的测试用例,把所有可能的错误想象列举出来作为假设,然后用原始的测试数据或者新的测试把不可能的假设逐一排除,最后用测试数据验证剩下的假设确实是错误的原因。
列出所有可能错误原因的假设,用表格列出所有可能的错误原因。通过它们,我们可以组织和分析现有的数据。
使用现有的测试数据来消除不正确的假设。
仔细分析现有的数据,寻找矛盾,努力排除上一步列出的所有原因。如果排除了所有的原因,就需要补充一些数据(测试案例)来建立新的假设。
改进剩余的假设;
利用已知的线索,进一步完善剩余的假设,使之更加具体,从而准确确定错误位置;
证明剩下的假设。
扩展数据:
软件调试技术的内容:
CPU的调试支持,包括异常、断点、单步执行、分支监控、JTAG、MCE等。
Windows操作系统中的调试工具包括内核调试引擎、用户态调试系统、验证器、沃森博士、WER、ETW、故障转储、WHEA等。
对Visual C/c++编译器的调试支持,包括编译时检查、运行时检查和调试符号。
WinDBG调试器的发展历史、模块结构、工作模式、用途、主要调试功能的实现细节,以及全书的应用实例。
内核调试、用户态调试、JIT调试、远程调试的原理、实现和用法。异常的概念,分布方法,处理方法(SEH,VEH,CppEH),未处理的异常,以及编译器编译异常处理代码的方法。
调试符号的作用、生成过程、存储格式和用法。栈和堆的结构布局、工作原理及相关软件问题,包括栈的自动增长和溢出、变慢;中间溢出、溢出攻击、内存泄漏、堆崩溃等。
-软件调试