排查 TestStand 系统中的内存增长问题

更新 Aug 9, 2024

环境

软件

  • TestStand

本文解释了 TestStand 系统中内存不足错误的原因,并概述了可用于识别和解决内存增长问题的调试过程。

创建长时间运行的 TestStand 序列时,您需要确保所创建的 TestStand sequence file 和 code module 不会导致内存随时间显着增长。在开发过程中,仔细管理测试序列和代码模块中的内存以避免内存不足错误是非常重要的。

内存增长对测试系统的影响

内存增长并不总是表明测试系统存在问题。例如,如果代码模块 (code module) 从硬件获取测量数据并将数据存储在数组中,则代码模块的内存使用量将随着数据的存储而增加,这是预期的现象。

然而,如果代码模块或其他测试系统组件分配的内存在不再需要时没有被释放,那么内存使用量将随着测试系统的执行而不断增加。一旦测试系统使用了所有可用内存,这最终可能会导致内存不足导致出现错误或崩溃。这种在多次测试序列迭代中不受控制的内存增长通常称为内存泄漏。
 

内存不足错误的原因

发生内存不足错误的原因有多种:

  • 单个测试循环期间内存增长过多。
    • 如果单个 UUT 的测试序列尝试分配比测试系统可用的内存更多的内存,则可能会发生这种情况。这通常会导致软件出现内存不足错误,类似于LabVIEW中“内存已满”错误的文章中的描述。
    • 例如,测试代码尝试分配连续的内存块来存储数组、字符串或其他大型数据集。
  • 多个测试循环的内存无限增长。
    • 如果测试序列或测试序列调用的代码模块中存在内存泄漏,则可能会发生这种情况。
    • 内存泄漏的示例包括:未能释放不再需要的内存,或者忘记在序列结束时关闭仪器句柄。

内存增长故障排除过程

由于需要调查的代码量很大,因此很难排查大型测试系统中的内存增长问题。另外,若测试系统执行的时间不足够长,内存增长可能不会出现错误,例如导致测试系统崩溃或其他不稳定。

由于这些原因,解决内存增长问题是一个系统化的过程,必须分析内存使用数据以了解正在发生的内存增长类型。首先,将测试代码缩小到重现内存增长的简化版本,并检查简化的代码以解决内存增长问题。下面的分步指南描述了此过程。

本系列中的其他文档在故障排除过程中的相关点提供了链接。他们将提供有关应采取的故障排除步骤的详细信息,以及如何解释过程中每个阶段收集的结果的指导。
 

分步故障排除指南

  1. 请参阅 Memory Limits of TestStand Systems  文档。
  2. 通过以上文档检查测试系统设置和配置,以了解测试系统可用的内存量。需要考虑的事情是:
    • 代码模块的类型以及它们的位数,例如 32 位还是 64 位。
    • 代码模块在进程内或进程外执行。
    • 报表采集数据的设置。
    • Model Plugin 设置。
  3. 使用内存分析工具收集有关测试系统内存使用情况的数据。
    1. 运行简化的代码来确定正在增长的内存类型以及每个测试用例循环的增长量。链接的文章解释了如何监控:
      1. 当前加载到物理内存中的虚拟内存,也称为内存专业工作集 (Private Working Set)。
      2. 对象句柄,可以用于引用仪器、LabVIEW VI 和其他操作。
      3. 线程。
      4. 用户对象,其中包括窗口、菜单和光标。
      5. 图形设备接口 (GDI) 对象。
  4. 简化 TestStand 序列,以专注于导致问题的较小步骤集。Characterizing Memory Issues in TestStand Systems 文档提供了如何执行此操作的指导。此故障排除过程应遵循以下结构:
    1. 在缩小测试用例范围时,使用步骤 3 中的内存分析工具来收集内存增长数据。
    2. 确定报表采集是否会导致内存增长,如链接文档中所述。您可以尝试以下操作来确认内存增加是否由报表采集导致。
      1. 禁用 Model plugin。
      2. 禁用特定测试序列或整个测试站的报表采集工作。
      3. 使用不同的 TestStand process model 运行,并注意是否可以观察到内存增长的差异。请按照为 TestStand 序列文件指定过程模型中的步骤获取指导说明。
      4. 跳过测试用例中的步骤或序列以缩小有问题的步骤集的范围。
      5. 如果可能,将测试序列缩小到特定的代码模块。
  5. 通过检查测试序列和代码模块来识别并解决内存增长问题。
    1. 如果该问题仅在启用报表采集数据或 model plugins 时出现,请参阅Prevent Memory Issues with TestStand Report Generation 文档来配置报表采集数据设置以节省内存。
    2. 将问题根源缩小到特定序列或代码模块。使用Identifying and Resolving Memory Growth Issues in TestStand System来确定内存增长属于哪个类别。
    3. 如果问题出现在 LabVIEW 代码模块中,请参阅步骤 5b文章中的LabVIEW code module 部分的。
    4. 如果问题发生在 LabWindows/CVI 代码模块中,请参阅步骤 5b文章中的LabWindows/CVI code module部分的。
    5. 如果问题发生在 .NET 代码模块中,请参阅步骤 5b文章中的.NET code module 部分。
  6. 按照本文档中链接的文章进行操作后,返回步骤 3 以确定内存增长问题是否已解决。