デスクトップ実行トレースツールキットを活用する | マーブルルール

デスクトップ実行トレースツールキットを活用する

その他

スポンサーリンク

LabVIEWに限りませんが、プログラムを作るということとデバッグを行うということは切っても切り離せない関係だと思います。

どんだけプログラム作りに慣れている人であっても、全くデバッグを行わないで大規模なプログラムを作ることは不可能で、むしろデバッグの能力もそれなりに鍛えられていないとプログラムが書けなかったりします。

LabVIEWには便利なデバッグ機能が多く備わっています。グラフィカルプログラミング言語であることを最大限活かした機能となっているため、プログラミング初心者でもデバッグツールの使い方にはある程度すぐ慣れることができると思います(実際にデバッグが首尾よくできるかどうかはともかく、ですが)。

プログラム開発の段階に応じてどんなデバッグのアプローチがありどのように行うのかを知っておくのは重要ですが、少しマイナーと思われるデバッグツールも存在します。

この記事では、LabVIEWプログラムや実行ファイルのデバッグに使えるけれどもマイナーな部類であろう、デスクトップ実行トレースツールキットの内容と使い方を紹介しています。

スポンサーリンク

デスクトップ実行トレースツールキット(DETT)とは

デスクトップ実行トレースツールキットは、LabVIEWプログラムのデバッグに使用できる機能であるデスクトップ実行トレースツールを使用するためのアドオンソフトのようなものです。(後述しますがインストールする必要があります)

このソフトで行う「デバッグ」は、他のデバッグツールでは調べられない(調べにくい)内容になっています。

そもそもLabVIEWでプログラムを組んだ際の初歩的なデバッグ方法としては、組んだプログラムを実行する際にそもそものプログラムの書き方にエラーがあった場合に見ることができるエラーリストがまず挙げられます。

エラーリストは壊れた実行ボタンを押すかあるいはCtrl + Lで表示させることができ、このリストに表示されるすべてのエラーが解消されないとそもそも実行することすらできません。

また、実行してからプログラムが期待した結果にならない場合にはブロックダイアグラムのメニューに表示されているデバッグツールを使用します。

この記事では深く扱いませんが、便利に使われるものとしてはプローブや実行のハイライトの機能がありますね。

こうしたデバッグツールを駆使してプログラムのアルゴリズム的なミスも解消できればもう後は何も心配いらない・・・かというと実際はそうでもなく、「気づきにくいミス」があったりします。わかりやすいところで行くとリファレンスリーク(開いたリファレンスを閉じずに放置)が挙げられます。

こういったミスを探すために使えるのがデスクトップ実行トレースツールキットです。Desktop Execution Trace Toolkitが英語名なのでDETTなどと呼ぶようなので以降はDETTと表現します。

本記事ではそんなDETTについて使い方などを紹介していきます。

DETTの使い方

では実際にDETTでどのようなことができるのかを見てみます。

DETTは、プログラム実行中に使用し、対象とするプログラムが実行中に起きたいくつかの項目についてどのようなタイミングで起こったかを逐次リストに表示します。プログラム実行中にリアルタイムでリストが更新されていきます。

DETTが検出できる項目は大別して以下の通りです。これらは常に全部捕捉する、というわけではなく、確認したい項目だけ選択することができます。

使う際には、まずDETTを開きます。

もし上の図のようにツールのメニューにProfileの項目がない場合にはDETTが表示されていない場合には別途インストールする必要があります。(LabVIEWのプロフェッショナル開発システムであれば追加のライセンスは必要ないと思います)

ややこしいのが、「Profile」ではなく「プロファイル」という項目も同じツールメニューにあることです。カタカナの「プロファイル」ではDETTを選択できません。インストールされていないと表示されないので、もしProfileの項目がない場合にはインストールする必要があります。

DETTが開けたら、アプリケーションインスタンスを確認します。viの左下に表示されているものが該当します。

例えば何かプロジェクトエクスプローラに属したviを実行する場合にはそのプロジェクト名が表示されていますが、何のプロジェクトにも属していないviには何も表示されない(代わりにメインアプリケーションインスタンスという名前になっている)状態です。

あとはDETTを開始して、その後にプログラムを実行すればそのプログラムに対して指定された項目の実行の様子がキャプチャされます。

DETTの使用例

では実際に具体的なプログラムに対してDETTがどのような結果を示すのかを紹介します。

まず初めに対象とするプログラムは以下のような簡単なファイルへの書き込みプログラムです。

このプログラムに対してDETTを適用していきます。なお、捕捉する項目としては除外しているものはなくすべてを選択した状態で実行します。

結果は以下の通りです。VIが実行された、ということしか捕捉していません。DETTが捕捉する内容としてVIの実行に関すること以外の内容がないためです。

次に、プログラムの一部にサブVIを使用してみます。

すると、以下のような結果になります。メインのVIの中で呼び出されたサブVIがどのタイミングで呼び出されたかが表示されるようになります。

タイミングが分かるというのはDETTの強みの一つで、複数のサブVIがあった場合にどのサブVIがどのようなタイミングで実行されたかを判別するのに役立ちます。

例えば以下のように複数のサブVIがあってそれぞれの実行時間に一定の時間が空いている場合を考えます。

これをDETTを使って解析すると、ちゃんと間の時間もTimeに捕捉されていることがわかります。

サブVIが使用されていないプログラムについてはそういうことができないかというとそうではなく、「DETTに記録を残しておく」ための関数が用意されているのでこれを活用できます。

この関数にはDETT上で表示させたいメッセージを配線することができるので、プログラムの各場所に置いておくことでどのタイミングでどの操作が実行されたかを知る目印となります。

とても簡単な例ですが、例えば以下のようにプログラムの複数の箇所にこの関数を使用したとします。

この結果、DETTでは関数に入力したメッセージも保存されるようになります。

DETTはキューおよびノーティファイアの操作もキャプチャすることができます。それなりの規模のプログラムになるとこれらキューやノーティファイアの関数は必ずと言っていいほど使われることになるので、それらの関数がどういったタイミングで実行されたかを知るのはプログラムの流れを把握するのに役立ちます。

例えば、キューを使用するにはキュー取得を始めとしていくつか必ず使われる関数が使用されるはずですね。

このプログラムを実行すると以下のような結果になります。

また、イベントストラクチャがイベントを検出したことも捕捉できます。

上のキューのプログラムに組み合わせた例を考えます。

実行するとDETTでは以下のような表示になります。

これまでに紹介した内容は、別にDETTを使用しなくてもわかるものもありますが、ファイルI/Oの関数などの「リファレンス」を使用する関数で正しくリファレンスを閉じていないといったミスは気づきにくい場合が多いと思います。

リファレンスを閉じていないことで発生するリファレンスリークもDETTの捕捉機能で検出でき、こうしたミスをDETTでつぶすことでメモリ使用効率を上げることができます。

これ以外の機能についても確認できるサンプルがNIサンプルファインダに入っています。

トレース結果を保存、比較する

DETTでトレースし、リストに表示された内容はテキストファイルに保存しておくことができます。

保存するためには設定でどのパスに保存しておくかを指定する必要があります。

また、これとは別に、DETT内で表示するための保存というものもあります。こちらの保存の場合、ファイルの拡張子がdetとなり、これをDETT内で開くことができます。

このファイルを用意しておくことで、後で別の機会にプログラムを実行した場合と結果を比較するために使用できます。

比較する際には、対象となるDETTの結果表示がそれぞれ別ウィンドウで開いている必要があります。そのために、上記のNew Traceを押して別ウィンドウで異なるトレースを表示させておいてから、下の図のようにCompare Tracesを選択します。

DETTを使用することでLabVIEWプログラムのより細かなブラッシュアップが可能になります。特にメモリリークなどはなかなか気づきにくかったりするので、長期間ずっと動作させるプログラムで問題が起きたときに、小さなメモリリークが積み重なってメモリ関係のトラブルが起こってしまう可能性などを探ることができます。

普段から使用すべきツールとは思っていませんが、いざというときに使えるよう、どういったことができるか概要の把握だけでもしてもらえたら嬉しいです。

ここまで読んでいただきありがとうございました。

コメント

タイトルとURLをコピーしました