メモリリークエラーとデバッグツールTrace Execution Toolkit
メモリリークエラーとTrace Execution Toolkit
LabVIEWによるソフトウェア開発においてメモリリークエラーが発生した事例と解決のためのデバッグツール「Trace Execution Toolkit」を紹介します。
問題発生内容
長期間、ADボードから圧力値(電流サンプリング)を取り込み、トレンドグラフを表示させる案件で、1か月ほど経過したときソフトウェア画面上に「作業を完了するにはメモリが不足しています」と表示され、プログラムが停止する問題が発生しました。
デバッグには最初、メモリの使用率をタスクマネージャのパフォーマンスやコントロールパネル-リソースモニタ等を使用して、長期間のエージングを行い、メモリの使用率が上昇していく状況をモニタしましたが、中々原因が判明しませんでした。
プログラム実行時の特徴的な症状
プログラムを長期で実行すると以下のような症状が起きていました。
- メニューの表示等、PC全体の動きが少しずつ遅くなりました。
- プログラムを終了する際、操作してから完全にプログラムが止まるまでかなり時間がかかっていました。
原因の発見
通常、実行時に1回だけ行うと「イベント登録」を、繰り返し実行するループの中で使用してしまったため、その中で行っている「イベント登録」をそのまま放置してメモリリークの原因となっていました。
対応
イベント登録の処理を繰り返し実行するループとは別のケースで処理するようプログラムを修正しました。
デバッグツールTrace Execution Toolkit
今回の問題で日本NIへ問い合わせした際に紹介してもらった「Desktop Execution Trace Toolkit 」を紹介します。
1.プロジェクトファイル-マイコンピュータのサブメニューから「Trace Execution…」を実行します
2.Capture Settingsで「Memory Allocations」にチェックを入れ、「Start」ボタンをクリックし、デバッグしたいプログラムを実行します
3.プログラム実行時の様々なイベントがリスト表示されます
4.リストの中で、イベント登録する際、メモリを76byte確保し、そのまま解放されずに、プログラム終了時に「Reference Leak」が発生していることがわかります。