动态分析

动态分析,动态分析指的是在组件或者系统的执行过程中评估其行为的过程,如内存性能及CPU使用率的估算等。由于动态分析是在运行测试对象的过程中对其进行分析,因此通常需要人工或自动地在测试对象的代码中插入一些探测器,即需要动态分析工具的支持。动态分析工具可以记录程序运行时的相关信息,因此需要在对象代码中增加相应的代码(通常由相应的开发人员完成这方面的工作)。

测试过程中经常会出现难以复现的缺陷,而且常常会对测试的工作量和最终发布产品的质量产生重大影响。它们可能来自于内存泄漏、不准确地使用指针和其他错误(如系统堆栈错误)等。这些缺陷可能使系统性能逐步恶化,以至系统崩溃。针对这种情况,测试策略必须考虑这些缺陷的相关风险,并且执行相应的动态分析减轻风险(通常需要工具的支持)。

动态分析可应用于如下方面。
(1)通过探测野指针和系统内存丢失阻止失效的发生。
(2)分析不容易再现的系统缺陷。
(3)评价网络行为。
(4)通过提供运行时系统行为信息来改进系统性能。
动态分析可在任何测试级别进行,在组件和集成测试中尤其有用。

内存泄漏

内存泄漏是由于程序的动态存储分配逻辑存在的缺陷导致内存使用后不能收回,并最终导致程序因为内存缺乏而运行失败。内存处理主要关注内存的分配、使用和释放,内存泄漏是由于应该被释放的资源没有正确释放,使程序丧失存取此内存的能力。从而导致程序占用的内存越来越多,并最后导致所有的内存耗尽。当内存分配给程序使用后,如果因为程序错误而没有释放,就会发生内存泄漏。

检测内存泄漏一般情况下需要工具的支持,工具会记录程序在运行过程中内存的泄漏情况,并且能够识别代码中内存泄漏发生的区域。开发人员通过工具提供的信息进行相关修正,从而解决内存泄漏问题。简单的内存监测也能获得可用内存随着时间而减少的总体情况,在开发或者测试过程中如出现这种情况,需要相关人员针对这种现象进一步地分析。

如果程序一直运行直到所有的内存耗尽,那么就会导致程序严重失效。内存泄漏的征兆是系统响应时间有规律地恶化,并最终导致系统失效。它们导致的问题随着时间的推移而逐步表现,通常不能立即被发现。内存泄漏可以通过重启系统或者重启程序来解决(尽管这不是合理的解决方案,但常常却是非常有效的)。例如,在测试过程中经常会出现有意识的重启系统或者重新安装系统,这样很容易屏蔽内存泄漏的问题。由于内存泄漏需要长时间的积累,因此其负面影响常常是在产品发布给客户之后,在客户的实际运行环境中才被发现。

在探测内存泄漏过程中,测试人员或者开发人员还应该考虑其他类型的泄漏,如文件句柄、信号和连接池等资源的泄漏情况。

动态分析内存泄漏的优点是在实际的内存泄漏影响出现之前即可发现。

野指针

野指针指的是指针所指处不在范围内或者不存在,指针是用来处理内存动态分配的手段。与固定地址不同,指针可以让系统发现对象实际所处的位置,并且指向程序的具体位置。程序中的野指针是在某些方面不能使用的指针,如可能有指针丢失应该指向的对象或函数,或没有指向应该指向的内存(如指针超过了数组的边界)。

当程序使用野指针时可能产生如下结果。
(1)程序可能按照预期执行,在这种情况下,野指针可能存取当前没有被程序使用的内存,如返回的结果并不是程序实际要求指向地址中的内容。
(2)程序可能崩溃,在这种情况下,野指针可能存取了其他程序运行的关键内存(如操作系统)。
(3)由于程序不能存取要求的对象导致程序功能不正确,在这种情况下,尽管可能发出一些错误信息,但是程序有可能继续运行。
(4)可能由于使用了不准确的值而导致数据崩溃。

任何对程序使用内存的更改(如更改后的软件包)都有可能触发上面的后果,特别关键的是尽管使用了野指针,程序在开始时仍然可以按照预期执行。但是在发生了某个变化后,程序出乎意料地崩溃了(甚至可能在产品运行环境中)。需要重视的是这种失效是潜在错误(如野指针)的表现,而不是错误本身。

发现由于错误指针处理缺陷导致的失效非常困难,这些失效并不经常出现。例如,程序运行了很长时间之后,可能得出错误的结果,甚至是系统崩溃。一般来说,探测野指针需要动态分析工具的支持。

性能分析

有些产品在实际交付给客户之后,发现其性能指标并不能满足需求,如系统支持的容量并不能达到客户规定的要求。动态分析也可以用来分析程序性能,称为“性能分析”,其目的是在产品正式发布之前测试产品在特定环境下的性能。

在客户正式使用产品之前,发现产品性能方面的问题是比较好的选择。一些动态分析的工具可以帮助识别程序的性能瓶颈,并且产生大量的性能度量指标。开发人员可以根据这些指标调整系统,有时也称为“性能调优”(Performance Profiling)。

酷客教程相关文章:

赞(0)

评论 抢沙发

评论前必须登录!