程序插桩:是借助往被测程序中插入 *** 作,来实现测试目的的方法。在调试程序时,常常在程序中插入一些打印语句,在执行程序时,打印出我们最为关系的信息,通过这些信息了解执行过程中程序的一些动态特性。
软件调试技术包括:
1、分析和推理;
设计人员和开发人员根据软件缺陷问题的信息,分析和推理调试软件。
根据软件程序架构自顶向下缩小定位范围,确定可能发生问题的软件组件。
根据软件功能,软件运行时序定位软件问题。
根据算法原理,分析和确定缺陷问题发生的根源。
2、归纳类比法;
归纳法是一种从特殊推断一般的系统化思考方法,归纳法调试的基本思想是:从一些线索(错误征兆)着手,通过分析它们之间的关系来找出错误。该方法主要是根据积累的工作经验和案例处理调试工作。
根据工作经验和比对程序设计中类似问题的处理方式进行调试工作。
咨询相关部门和有经验的相关人员。
查找相关文档和案例,为处理问题提供思路和方法。在软件开发过程中,通常对每个缺陷问题进行跟踪管理,将解决问题的方案和过程详细记录。
收集出错的信息,列出数据,包括输入,输出,归纳整理,发现规律,从线索除法,寻找线索之间的联系。也就意味着:从特殊到一般。
3、跟踪回朔;
在小程序中常用的一种有效的调试方法,一旦发现了错误,人们先分析错误的征兆,确定最先发现“症状“的位置然后,人工沿程序的控制流程,向回追踪源程序代码,直到找到错误根源或确定错误产生的范围。
例如,程序中发现错误处是某个打印语句,通过输出值可推断程序在这一点上变量的值,再从这一点出发,回溯程序的执行过程,反复思考:“如果程序在这一点上的状态(变量的值)是这样,那么程序在上一点的状态一定是这样···“直到找到错误所在。
在软件开发通常采用基线与版本管理。基线为程序代码开发提供统一的开发基点,基线的建立有助于分清楚各个阶段存在的问题,便于对缺陷问题定位。软件版本在软件产品的开发过程中生成了一个版本树。软件产品实际上是某个软件版本,新产品的开发通常是在某个软件版本的基础上进行开发。
开发过程中发现有问题,可以回退至版本树上的稳定版本,查找问题根源。
通过基线版本序列可以追踪产品的各种问题,可以重新建立基于某个版本的配置,可以重现软件开发过程中的软件缺陷和各种问题,进行定位并查找问题根源。
4、增量调试;
软件开发大多采用软件配置管理和持续集成技术。开发人员每天将评代码提交到版本库。持续集成人员完成集成构建工作。
可以通过控制持续集成的粒度(构建时间间隔),控制开发人员提交到版本库的程序代码量,从而便于对缺陷问题定位。
通常每天晚上进行持续集成工作,发现问题时,开发人员实际上只需要调试处理当天编写的代码。
5、写出能重现问题的最短代码;
采用程序切片和插桩技术写出能重现问题的最短代码调试软件模块。
程序切片程序切片是通过在特定位置消除那些不影响表达式计算的所有语句,把程序减少到最小化形式,并仍能产生给定的行为。
使用切片技术,可以把一个规模较大并且较复杂的软件模块转换成多个切片程序。这些切片程序相对原来的程序,简单并且易于调试和测试。
程序插桩程序插桩方法是在被测程序中插入某些语句或者程序段来获取各种信息。通过这些信息进一步了解执行过程中程序的一些动态特性。一个软件组件的独立调试和测试需要采用插桩技术,该组件调用或运行需要桩模块。在软件模块的调试过程中程序切片和程序插桩可以结合起来使用。
6、日志追踪技术;
日志是一种记录机制,软件模块持续集成构建过程中,日志文件记录了有用信息。若构建失败,通过查看日志文件,将信息反馈给相关人员进行软件调试。
7、调试和测试融合的技术;
测试驱动开发。
测试驱动开发是一种不同于传统软件开发流程的开发方法。在编写某个功能的代码之前先编写测试代码,然后编写测试通过的功能代码,这有助于编写简洁可用和高质量的代码。
开发与测试融合。
程序开发人员除了进行程序代码的编写,白盒测试,也要完成基本的功能测试设计和执行。这样有助于程序开发人员更好地开展调试工作。
程序开发人员可以通过交叉测试来解决测试心理学的问题(不能自己测试自己)。采用这种模式测试人员的数量会减少,专业的测试人员去做其他复杂的测试工作。
研发中的很多低级缺陷会尽早在开发过程中被发现,从而减少缺陷后期发现的成本。
8、强行排错;
这种调试方法目前使用较多,效率较低,它不需要过多的思考,比较省脑筋。例如:
通过内存全部打印来调试,在这大量的数据中寻找出错的位置。
在程序特定位置设置打印语句,把打印语句插在出错的源程序的各个关键变量改变部位,重要分支部位,子程序调用部位,跟踪程序的执行,监视重要变量的变化
自动调用工具,利用某些程序语言的调试功能或专门的交互式调试工具,分析程序的动态过程,而不必修改程序。
应用以上任一种方法之前,都应当对错误的征兆进行全面彻底的分析,得出对出错位置及错误性质的推测,再使用一种适当的调试方法来检验推测的正确性。
9、演绎法调试;
演绎法是一种从一般原理或前提出发,经过排除和精华的过程来推导出结论的思考方法,演绎法排错是测试人员首先根据已有的测试用例,设想及枚举出所有可能出错的原因作为假设,然后再用原始测试数据或新的测试,从中逐个排除不可能正确的假设,最后,再用测试数据验证余下的假设确是出错的原因。
列举所有可能出错原因的假设,把所有可能的错误原因列成表,通过它们,可以组织,分析现有数据。
利用已有的测试数据,排除不正确的假设。
仔细分析已有的数据,寻找矛盾,力求排除前一步列出所有原因,如果所有原因都被排除了,则需要补充一些数据(测试用例),以建立新的假设。
改进余下的假设;
利用已知的线索,进一步改进余下的假设,使之更具体化,以便可以精确地确定出错位置;
证明余下的假设。
扩展资料:
软件调试技术的内容:
CPU的调试支持,包括异常、断点、单步执行、分支监视、JTAG、MCE等。
Windows *** 作系统中的调试设施,包括内核调试引擎、用户态调试予系统、验证器、Dr.Watson、WER、ETW、故障转储、WHEA等。
VisualC/C++编译器的调试支持,包括编译期检查、运行期检查,以及调试符号。
WinDBG调试器的发展历史、模块结构、工作模型、使用方法、主要调试功能的实现细节,以及遍布全书的应用实例。
内核调试、用户态调试、JIT调试、远程调试的原理、实现和用法。异常的概念、分发方法、处理方法(SEH、VEH、CppEH),未处理异常,以及编译器编译异常处理代码的方法。
调试符号的作用、产生过程、存储格式和使用方法。栈和堆的结构布局、工作原理和有关的软件问题,包括栈的自动增长和溢出,缓;中区溢出,溢出攻击,内存泄漏,堆崩溃等。
参考资料:百度百科-软件调试
1、按是否查看程序内部结构分为:(1)黑盒测试(black-box
testing):只关心输入和输出的结果
(2)白盒测试(white-box
testing):去研究里面的源代码和程序结构
2、按是否运行程序分为:
(1)静态测试(static
testing):是指不实际运行被测软件,而只是静态地检查程序代码、界面或文档可能存在的错误的过程。
静态测试包括:
对于代码测试,主要是测试代码是否符合相应的标准和规范。
对于界面测试,主要测试软件的实际界面与需求中的说明是否相符。
对于文档测试,主要测试用户手册和需求说明是否真正符合用户的实际需求。
(5)动态测试(dynamic
testing),是指实际运行被测程序,输入相应的测试数据,检查输出结果和预期结果是否相符的过程
3、按阶段划分:
(1)单元测试(unit
testing),是指对软件中的最小可测试单元进行检查和验证。
桩模块(stud)是指模拟被测模块所调用的模块,驱动模块(driver)是指模拟被测模块的上级模块,驱动模块用来接收测试数据,启动被测模块并输出结果。
(2)集成测试(integration
testing),是单元测试的下一阶段,是指将通过测试的单元模块组装成系统或子系统,再进行测试,重点测试不同模块的接口部门。
集成测试就是用来检查各个单元模块结合到一起能否协同配合,正常运行。
(3)系统测试(system
testing),指的是将整个软件系统看做一个整体进行测试,包括对功能、性能,以及软件所运行的软硬件环境进行测试。
系统测试的主要依据是《系统需求规格说明书》文档。
(4)验收测试(acceptance
testing),指的是在系统测试的后期,以用户测试为主,或有测试人员等质量保障人员共同参与的测试,它也是软件正式交给用户使用的最后一道工序。
验收测试又分为a测试和beta测试,其中a测试指的是由用户、
测试人员、开发人员等共同参与的内部测试,而beta测试指的是内测后的公测,即完全交给最终用户测试。
4、黑盒测试分为功能测试和性能测试:
1)功能测试(function
testing),是黑盒测试的一方面,它检查实际软件的功能是否符合用户的需求。
包括逻辑功能测试(logic
function
testing)
界面测试(UI
testing)UI=User
Interface
易用性测试(usability
testing):是指从软件使用的合理性和方便性等角度对软件系统进行检查,来发现软件中不方便用户使用的地方。
兼容性测试(compatibility
testing):包括硬件兼容性测试和软件兼容性测试
2)性能测试(performance
testing)
软件的性能主要有时间性能和空间性能两种
时间性能:主要指软件的一个具体事务的响应时间(respond
time)。
空间性能:主要指软件运行时所消耗的系统资源。
软件性能测试分为:
一般性能测试:指的是让被测系统在正常的软硬件环境下运行,不向其施加任何压力的性能测试。
稳定性测试也叫可靠性测试(reliability
testing):是指连续运行被测系统检查系统运行时的稳定程度。
负载测试(load
testing):是指让被测系统在其能忍受的压力的极限范围之内连续运行,来测试系统的稳定性。
压力测试(stress
testing):是指持续不断的给被测系统增加压力,直到将被测系统压垮为止,用来测试系统所能承受的最大压力。(Validate
the
system
or
software
can
allowed
the
biggest
stress.)
5、其他测试类型:
回归测试(regression
testing)是指对软件的新的版本测试时,重复执行上一个版本测试时的用例。(When
a
new
build
or
release
is
deployed,
repeat
all
the
test
cases
which
has
executed
in
the
last
build
or
release.)
冒烟测试(smoke
testing),是指在对一个新版本进行大规模的测试之前,先验证一下软件的基本功能是否实现,是否具备可测性。(validate
the
major
function
is
deployed
or
not
in
software
of
system
when
a
new
build
or
release
is
implement.)
随机测试(random
testing),是指测试中所有的输入数据都是随机生成的,其目的是模拟用户的真实 *** 作,并发现一些边缘性的错误。(means
or
all
the
test
data
is
random,
to
validate
the
some
edge
bugs.)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)