對TestStand 系統中的記憶體增長問題進行故障排除

更新 Feb 10, 2025

環境

軟體

  • TestStand

本文解釋了 TestStand 系統中記憶體不足錯誤的原因,並概述了可用於辨別和解決記憶體增長問題的除錯過程。

當創建需長時間運行的 TestStand sequence時,一個關鍵問題是得創建不會導致記憶體隨時間顯著增長的sequences和code modules。在開發過程中為避免記憶體不足錯誤,仔細管理test sequences和code modules 中的記憶體是非常重要的。

記憶體增長對測試系統的影響

重要的是要認清到記憶體增長並不一定是代表著測試系統存在問題。例如,如果code module從硬體獲取測量數據並將數據儲存在陣列中,則code module的記憶體使用量將隨著數據的儲存而增加。通常這種類型的記憶體增長是預料到會發生的。

然而,如果code module或其他測試系統零件在不需要時沒有釋放所分配的記憶體,則記憶體使用量將隨著測試系統的執行而不斷增加。一旦測試系統使用了所有可用記憶體,這最終可能會導致記憶體不足錯誤或崩潰。這種在多次test sequences迭代中不受控制的記憶體增長通常稱為記憶體洩漏。

記憶體不足錯誤的原因

發生記憶體不足錯誤的原因有很多種:

  • 單個test loop期間記憶體增長過多。
    • 如果single UUT 的test sequences嘗試分配的記憶體比測試系統可用的記憶體還要更多,則可能會發生這種情況。而這通常會導致記憶體不足錯誤,類似於LabVIEW 中的內記憶體已滿錯誤中描述的錯誤。
    • 例如,test code嘗試分配連續的記憶體區塊來儲存陣列、字串或其他大型數據集。
  • 多個test loop無限增長的記憶體。
    • 如果test sequences或test sequences調用的code module中存在記憶體洩漏,則可能會發生這種情況。
    • 記憶體洩漏的範例包括:未能釋放不再需要的記憶體,或者忘記在sequences結束時關閉 instrument handles。


記憶體增長故障排除過程

由於需要調查的程式碼量體很大,因此很難追踪大型測試系統中的記憶體增長問題。另外,測試系統得在執行很長一段時間之後,記憶體增長才會導致錯誤,並且可能會導致測試系統崩潰或其他不穩定。

由於這些原因,解決記憶體增長問題是一個系統化的過程,必須分析記憶體使用數據以了解正在發生的增長類型。首先,將測試程式碼縮小到能重現記憶體增長的簡化版本,並檢查簡化的程式碼以解決記憶體增長問題。下面的逐步指南描述了此過程。

在本系列故障排除過程中的相關要點提供了其他文件的連結。他們將提供有關應採取的故障排除步驟的詳細信息,以及指導如何解釋過程中每個階段收集的結果。

逐步故障排除指南

  1. 請參閱 TestStand 系統的記憶體限制文件來檢視測試系統的記憶體限制。
  2. 使用連結文件檢查測試系統設置和配置,以了解測試系統可用的記憶體容量。需要考慮的事情是:
    • code modules的類型以及它們是 32 位元還是 64 位元。
    • code modules在in-process 或是 out-of-process 執行。
    • Result collection的設定。
    • Model plugin的設定。
  3. 使用記憶體分析工具收集有關測試系統記憶體使用情況的數據。
    1. 運行簡化的程式碼來確定正在增長的記憶體類型以及每個test case循環的增長量。連結的文章有解釋如何監控:
      1. 當前加載到實際記憶體中的虛擬記憶體,也稱為Private Working Set。
      2. Object handles,可以引用儀器、LabVIEW VI 和其他操作。
      3. Threads。
      4. User objects,包括視窗、選單和游標。
      5. Graphics Device Interface (GDI) objects。
  4. 簡化 TestStand sequence,以專注於導致問題的較小step集。 Characterizing TestStand 系統中的記憶體問題文件提供如何執行此操作的指導。此故障排除過程應遵循以下結構:
    1. 在縮小test case範圍時,使用步驟 3 中的記憶體分析工具來收集記憶體增長數據。
    2. 確定結果收集是否有助於記憶體增長,如連結文件中所述。這將包括:
      1. 禁用model plugins。
      2. 禁用特定 test sequences或整個測試站的 result collectio。
      3. 使用不同的 TestStand process models執行,並注意是否可以觀察到記憶體增長的差異。請按照為TestStand Sequence File 指定Process Model中的步驟獲取指導說明。
      4. 跳過 test case中的step或sequence以縮小有問題的step集的範圍。
      5. 如果可能,將 test sequences縮小到特定的code modules。
  5. 通過檢查test sequence和code module來辨別並解決記憶體增長問題。
    1. 如果該問題僅在啟用 result collection或model plugins時出現,請參閱防止 TestStand 報告生成出現記憶體問題文件來配置 result processing 設定以節省記憶體。
    2. 將問題來源縮小到特定sequence或code module。使用辨別和解決 TestStand 系統中的記憶體增長問題來確定記憶體增長屬於哪個類別。
    3. 如果問題出現在 LabVIEW code modules中,請參閱文章中的LabVIEW code modules部分的步驟 5b。
    4. 如果問題發生在 LabWindows/CVI code modules中,請參閱文章中的LabWindows/CVI code modules部分的步驟 5b。
    5. 如果問題發生在 .NET code modules中,請參閱文章的步驟 5b 中的.NET code modules部分。
  6. 按照本文件中連結的文章進行操作後,返回步驟 3 以確定記憶體增長問題是否已解決。