65.9K
CodeProject 正在变化。 阅读更多。
Home

Software Verification 的 Memory Validator

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2002 年 5 月 15 日

CPOL
viewsIcon

462127

Memory Validator 是一款针对 Windows 应用程序的自动运行时错误检测软件工具。

这是 CodeProject 赞助商系列产品展示评测的第一篇。这些评测旨在为您提供我们认为对开发者有用且有价值的产品和服务信息。它们也允许您讨论产品,并与制造商或供应商进行一对一的互动。

Software Verification Logo

更快的内存泄漏检测,更好的分析。

软件开发中的一个常见问题是检测和修复内存泄漏、句柄泄漏和内存损坏。在没有软件工具的帮助下执行此任务可能是一个缓慢且耗时的过程,通常会导致大量时间浪费,因为调查的途径被证明是死胡同,并且对错误的搜索会转向软件的不同区域。随着代码库的增大,这个问题会变得越来越难以解决和管理。

通常会采用软件工具来解决这个问题。选择合适的软件工具需要该软件工具提供各种功能。

  • 该软件工具不得改变被监控程序的行为。
  • 该软件工具对被监控程序的性能(速度和可靠性)的影响应尽可能小。
  • 该软件工具应提供尽可能多的查询收集数据的方式,以便最终用户可以从多个角度审视特定问题。
  • 该软件工具应该是可配置的,以便用户可以选择定制工具的行为。这允许用户在收集所需数据的同时,最大限度地提高数据收集的速度,而无需收集不必要的数据来调查正在调查的错误。
  • 如果被监控的程序崩溃,该软件工具也不能崩溃。
  • 该软件工具必须可靠,并且在软件工具崩溃的情况下,不得导致被监控的程序崩溃。
  • 该软件工具还应能够用于回归测试,以便质量保证部门能够以最小的努力生成缺陷报告来指导软件维护。

Software Verification 的 Memory Validator 满足以上所有标准。

Memory Validator 是一款针对 Windows 应用程序的自动运行时错误检测软件工具。Memory Validator 检测与动态内存分配、Windows 资源和句柄管理使用相关的常见问题。这些问题包括检测内存泄漏、资源泄漏、句柄泄漏、不正确的分配、缓冲区溢出、缓冲区下溢、数据损坏、引用计数错误和未初始化数据。Memory Validator 还支持检测代码中分配、重新分配或释放大量内存或句柄的热点。

使用 Memory Validator 无需对您的程序进行特殊准备,只需使用 Memory Validator 启动您的程序,Memory Validator 就会监视您的程序行为。您无需重新编译或重新链接您的程序*。当您的程序出现错误时,例如内存双重释放或缓冲区覆盖,Memory Validator 会告诉您,显示错误、错误的调用堆栈以及错误的源代码。当您关闭程序时,Memory Validator 会显示所有已泄漏的内存。Memory Validator 显示的每种数据类型都使用颜色编码,易于识别。强大的过滤机制允许您简化收集到的数据和显示的数据,以便您可以一次专注于一个特定错误。

expanded view of memory allocations

Memory Validator 支持的不仅仅是 C 运行时堆,您还可以监视 Win32 的 HeapAlloc()LocalAlloc()GlobalAlloc()VirtualAlloc() 函数,以及您自己编写的自定义堆管理器。如果您在软件中使用引用计数方案,您就会遇到引用计数不同步的问题,以及试图确定计数是如何不同步的。Memory Validator 支持跟踪这类错误。

有时您想要监视的程序已经在运行,或者您想要监视的程序是由另一个程序启动的。例如,您的程序是一个 COM 服务器,当文档嵌入网页时启动。Memory Validator 支持在网页请求 COM 对象时附加到您的服务器。这对于识别只在程序作为 COM 服务器运行时发生、而不是作为独立程序运行时发生的双重释放或内存泄漏非常有用。如果您想要监视的程序已经在运行,您可以附加 Memory Validator 到该程序,并从该点开始监视程序直至其结束。

强大的分析功能允许您按地址、接近地址查找内存分配,查找持有指向某地址的指针的分配(对于确定哪些对象仍在引用您正在检查的内存分配很有用),以及查找被您正在检查的分配中的指针指向的分配(对于确定此对象正在使用哪些对象很有用)。您可以按对象类型、调用堆栈中函数的完整或部分名称、或者调用堆栈顶部函数的名称查找分配。您可以按文件名、DLL 名称、地址范围、页面范围、大小范围、分配 ID 号(仅调试)、分配堆和分配类型(alloc、realloc、free)查找内存分配。在分析页面上,您可以选择一个分配,然后要求查看所有相关对象。相关对象包括相同类型的对象、之前在该地址分配的对象(有助于分析在过早删除后可能发生了什么)、同一类的其他对象、在同一类、文件或模块中分配的其他对象等等。基于分析结果,您可以选择一个、多个或所有结果,然后对这些对象重复查询,以深入遍历整个分配链,查看哪个对象与哪个对象相关。此功能在查找非常细微的错误原因时非常有用,这些错误通常是在导致程序出现可见错误之前的数百或数千次分配造成的。

Memory Validator 提供每种类型内存当前分配数量的可视化表示,以及活动句柄的总数,虚拟内存映射的可视化表示,不同类型的内存使用有不同的颜色。此视图对于确定为什么请求大块内存失败非常有用。您的计算机可能会报告 X 字节可用,但当您查看内存映射时,您可以看到内存分散在 20 个不同的块中,这些块不是连续的。

Memory Validator 支持检测内存分配热点。一旦识别出热点,就可以修改内存分配和释放策略,以改进内存消耗方式,从而减轻内存分配器的压力,从而提高程序性能。

Memory Validator 支持确保在测试会话期间已访问程序中所有可以分配、重新分配或释放内存的位置。此支持由 Coverage 窗口提供。质量保证团队可以使用这些指标来确保应用程序在发布前已得到彻底测试。

Memory Validator 支持回归测试。回归测试可以以手动和自动模式进行。回归测试允许您将基线会话与代表刚刚执行的测试的会话进行比较。当两个会话进行比较时,您可以看到您在修复内存泄漏方面取得了哪些改进,以及在检测内存泄漏方面出现了哪些回归。您可以将这些结果导出为 HTML 和 XML 格式以供进一步处理。自动回归测试允许您从命令行或批处理文件运行 Memory Validator,启动您选择的程序,监视内存泄漏,将结果会话与测试的基线进行比较,生成回归测试报告,保存会话并将结果导出为 HTML 和 XML。对于质量保证部门,他们可以使用回归测试功能配合其隔夜测试套件,在第二天一目了然地了解软件哪些部分正在改进或退步。这可以极大地提高隔夜/滚动构建软件的错误检测率。XML 报告可以进一步处理以生成报告,这些报告可以放在内部 bug 报告 Web 服务器上,或者转发给管理层采取进一步行动。

Memory Validator 非常可配置。默认选项允许您立即着手解决常见问题。为了进行更全面的错误检测,您可以启用更多选项,或者只启用与您的 bug 相关的选项。例如,如果您有兴趣跟踪句柄泄漏,您不希望您的软件工具跟踪内存泄漏——那将是浪费时间和精力。使用 Memory Validator,您可以做到这一点,关闭内存泄漏跟踪,只跟踪句柄。或者,假设您想跟踪内存泄漏,但只跟踪 HeapAlloc()HeapReAlloc()HeapFree() 函数,而不是 C 运行时。关闭 CRT 跟踪,打开 HeapAlloc() 跟踪并启动您的程序。这只是两个例子,说明如何提高使用 Memory Validator 查找 bug 的速度和简易性。可配置性远不止于此,如果需要,您可以深入到函数级别来指定应该监视和不应该监视哪些函数。

Memory Validator 的典型用户是那些不想花费大量时间来识别导致程序内存损坏、双重删除或内存泄漏原因的软件开发人员。质量保证部门将对自动回归测试的支持感兴趣。管理层将乐于看到从 Memory Validator 导出的数据可以转换为报告,这些报告表明了改进和回归,这得益于对 XML 导出的支持。

对于希望快速有效地识别和修复难以查找的内存泄漏、资源泄漏和内存损坏的专业人士来说,Memory Validator 是一款必备工具。

有关 Memory Validator 的销售和信息,请 点击此处

* 要使用 Memory Validator API,您需要链接到一个特定的库文件。此更改只需执行一次。如果您使用的是静态 C 运行时库,您可能需要更改编译器设置以使用动态 C 运行时库。此更改只需执行一次。

© . All rights reserved.