デバッグ方法
- 更新日2025-08-27
- 20分で読める
VIが壊れていないにもかかわらず予期したデータが得られない場合は、複数のテクニックを使用してVIやブロックダイアグラムのデータフローの問題を識別して修正します。以下の方法でVIをデバッグできない場合、そのVIに競合状態が発生している可能性があります。
エラークラスタ
ほとんどの標準VI/関数には、エラー入力/エラー出力パラメータがあります。これらのパラメータは、ブロックダイアグラムの各ノードで発生したエラーを検知し、エラーが発生したかどうか、またエラーが発生した場合はその場所を示します。また、作成するVIでこれらのパラメータを使用することもできます。
VI/関数のエラーパラメータを配線すると、エラー入力クラスタおよびエラー出力クラスタから以下の情報を得ることができます。
- ステータスはブール値であり、エラーが発生した場合にTRUEとなります。
- コードはエラーを数値で識別するための符号付き32ビット整数です。ステータスがFALSEのときにエラーコードが0以外の値である場合は、エラーでなく警告であることを示します。
- ソースはエラーが発生した場所を示す文字列です。
警告
警告が表示されてもVIは実行されますが、予期しない動作が発生する可能性があります。VIをデバッグするときは、警告が表示されるように設定してください。VIで警告が発生した場合は、ウィンドウで原因を特定し、VIを修正します。
実行のハイライト
ブロックダイアグラムの実行を動画表示するには、以下に示す実行のハイライトボタンをクリックします。
実行のハイライトでは、ワイヤ上で移動するバブルによりブロックダイアグラムのノードからノードへのデータの動きが表示されます。この機能をシングルステップとともに使用すると、VI全体でノードからノードにデータ値がどのように移動するかを調べることができます。
|
メモ 実行のハイライトは、VIの実行速度を大幅に削減します。VIの速度が予期せず遅い場合は、サブVIの実行のハイライトがオフになっているか確認してください。 |
エラー出力クラスタがエラーをレポートすると、エラー値が赤でエラー出力の横に表示されます。エラーがない場合は、エラー出力の横にOKが緑の枠で表示されます。
シングルステップ
VIをシングルステップで実行すると、ブロックダイアグラム上で実行される各動作を確認することができます。シングルステップボタンは、以下のように、シングルステップモードのVIやサブVIでの実行にのみ影響を与えます。
シングルステップモードに切り替えるには、ブロックダイアグラムのツールバーにある中に入るまたは飛び越えるボタンをクリックします。飛び越える、外に出る、または中に入るボタン上にカーソルを移動すると、そのボタンをクリックした場合の次のステップを記述したヒントラベルが表示されます。サブVIは、シングルステップを実行するか、または通常どおりに実行できます。
VIでシングルステップを実行すると、ノードが点滅して、それらのノードが実行できる状態であることを示します。実行のハイライトをオンにした状態でVIをシングルステップで実行する場合は、以下のような実行グリフが現在実行中のサブVIのアイコン上に表示されます。
プローブツール
VI実行時にワイヤ上の中間値を確認するには、以下のようにプローブツールを使用します。
一連の操作を含む複雑なブロックダイアグラムがある場合、操作のいずれかが不正確なデータを返す可能性があるため、プローブツールを使用します。実行のハイライト、シングルステップ、ブレークポイントとともにプローブツールを使用して、データに誤りがないか、またその場所を確認します。データが使用できる場合、実行のハイライトまたはシングルステップの実行中、あるいはブレークポイントを一時停止すると、プローブはすぐにデータを更新してデバッグウィンドウに表示します。シングルステップまたはブレークポイントによって実行がノードで一時停止している場合、実行されたばかりのワイヤをプローブして、そのワイヤを通過した値を確認することもできます。
プローブのタイプ
VIの実行時にワイヤ上の中間値をチェックするには、一般プローブを使用するか、制御器パレットにある表示器を使用してデータを表示するか、既定プローブを使用するか、カスタマイズされた既定プローブを使用するか、新規プローブを作成します。
一般
ワイヤを介して渡されたデータを表示するには、一般プローブを使用します。一般プローブを使用するには、ワイヤを右クリックしてショートカットメニューからカスタムプローブ»一般プローブを選択します。
一般プローブはデータを表示します。データに応答するように一般プローブを構成することはできません。
データタイプに対してカスタムプローブまたは既定プローブを指定しない限り、LabVIEWではワイヤを右クリックしてプローブを選択すると一般プローブが表示されます。
カスタムプローブは、VIと同様にデバッグすることができます。ただし、プローブは配置されているブロックダイアグラムやそのサブVIのブロックダイアグラムをプローブすることはできません。プローブのデバッグには一般プローブを使用します。
表示器を使用してデータを表示する
表示器を使用して、ワイヤを介して渡されるデータを表示することもできます。たとえば、数値データを表示する場合、プローブ内でチャートを使用してデータを表示できます。ワイヤを右クリックして、ショートカットメニューからカスタムプローブ»制御器を選択し、使用する表示器を選択します。制御器パレット上の制御器を選択をクリックし、コンピュータまたはサーバ上の共有ディレクトリに保存されたカスタム制御器またはタイプ定義を選択します。LabVIEWは、プローブを挿入したデータを表示するために使用されたタイプ定義をカスタム制御器として扱います。
選択した表示器のデータタイプが、右クリックしたワイヤのデータタイプと一致しない場合、表示器はワイヤ上に配置されません。
既定のプローブ
既定のプローブは、ワイヤを介して渡されるデータに関する総合的な情報を表示するVIです。たとえば、VI Refnumプローブは、リファレンスのVI名、VIパス、および16進数値に関する情報を返します。また、既定のプローブを使用すると、ワイヤを通過するデータに基づいて応答することができます。たとえば、エラークラスタ上のエラープローブを使用して、エラーの状態、コード、ソース、および説明を受け取り、エラーまたは警告が発生した場合に条件付きブレークポイントを設定するかどうかを指定することができます。
既定のプローブは、カスタムプローブショートカットメニューの一番上に表示されます。ワイヤを右クリックして、ショートカットメニューからカスタムプローブを選択し、既定のプローブを選択します。右クリックしたワイヤのデータタイプと一致するプローブのみがショートカットメニューに表示されます。
カスタム
新規プローブを作成ダイアログボックスは、既存プローブに基づいてプローブを作成するか、または新規プローブを作成します。ワイヤを右クリックして、ショートカットメニューからカスタムプローブ»新規を選択して、新規プローブを作成ダイアログボックスを表示します。ワイヤ上を流れるデータをプローブする際により自由に制御できるようにするには、プローブを作成します。新規プローブを作成すると、プローブのデータタイプと右クリックしたワイヤのデータタイプが一致します。作成したプローブを編集する場合、保存したディレクトリからプローブを開く必要があります。
カスタムプローブショートカットメニューからプローブを選択するか、制御器を選択パレットオプションを使用してそのプローブに移動するか、あるいは新規プローブを作成ダイアログボックスで新規プローブを作成した後、そのプローブがそのデータタイプのデフォルトプローブとなり、ワイヤを右クリックしてショートカットメニューからプローブを選択すると、そのプローブがロードされます。LabVIEWでは右クリックしたワイヤのデータタイプと完全に一致するプローブのみをロードします。つまり、LabVIEW上ではデータの変換はできますが、倍精度小数点数プローブは32ビット符号なし整数ワイヤをプローブすることはできません。
サンプリングプローブ
(PGAモジュール) ホストVIまたはFPGA VIでサンプリングプローブを使用して、VIを実行中にワイヤ上の中間値を確認したり、シングルサイクルタイミングループから信号をデバッグする必要がある場合などに、信号データの変化を時間軸で確認します。
ホストVIでサンプリングプローブを使用する場合、最初にプローブのサンプリングソースを指定する必要があります。サンプリングソースは、LabVIEWが関連するプローブからデータの読み取りまたはサンプルをいつ実行するかを決定します。サンプリングプローブをホストVIで使用するかFPGA VIで使用するかによって、Whileループ、Forループ、またはFPGAシミュレーション時間をサンプリングソースとして使用できます。
ブレークポイント
VI、ノード、ワイヤにブレークポイントを配置し、その位置で実行を一時停止するには、以下に示すブレークポイントツールを使用します。
ワイヤ上にブレークポイントを設定すると、データがワイヤを通過した後実行は一時停止され、一時停止ボタンが赤で表示されます。ブロックダイアグラムにブレークポイントを配置して、ブロックダイアグラムのすべてのノードが実行された後、実行を一時停止します。その場合ブロックダイアグラムの境界は赤になり、ブレークポイントまで実行された場合は境界が点滅します。
VIがブレークポイントで一時停止すると、LabVIEWはブロックダイアグラムを表示し、ブレークポイントを含むノード、ワイヤ、スクリプトのラインをマーキーでハイライトします。既存のブレークポイントにカーソルを移動すると、ブレークポイントツールのカーソルの黒い部分が白で表示されます。
実行中にブレークポイントに到達するとVIは一時停止し、一時停止ボタンは赤になります。また、VIのバックグラウンドおよび枠も点滅し始めます。以下の操作を実行することができます。
- シングルステップボタンを使用してシングルステップモードで実行する。
- VIを実行する前にワイヤに配置したプローブの中間値を確認する。
- ワイヤ値を保持オプションを有効に設定した場合、VIの実行後に配置するプローブの中間値を確認する。
- フロントパネル制御器の値を変更する。
- 呼び出しリストプルダウンメニューで、ブレークポイントで停止したVIを呼び出すVIのリストを確認する。
- 一時停止ボタンをクリックして、次のブレークポイントまで、またはVIが実行を停止するまで実行を継続する。
LabVIEWはVIとともにブレークポイントを保存しますが、VIを実行する場合にのみブレークポイントはアクティブになります。ブレークポイントは、反復使用する際に、削除や再作成を行う代わりに、保存しておくと便利です。ただし、VIを実行するたびにすべてのブレークポイントをアクティブにしてしまうと面倒な場合があります。VIの実行時にブレークポイントを無効にすると、ブレークポイントで実行が一時停止しません。既存のブレークポイントを無効、有効、クリア、または検索するには、デバッグウィンドウを使用できます。表示 → デバッグウィンドウを選択するか、またはブロックダイアグラムでオブジェクトを右クリックしてショートカットメニューからブレークポイントを選択することで、デバッグウィンドウを開きます。
ブレークポイントの削除は、VI階層全体で、または個々に行えます。
LabVIEWでのブレークポイントのハイライト
ブロックダイアグラムでブレークポイントを配置する位置によって、LabVIEWでブレークポイントがハイライトされる方法、実行が停止するタイミングが異なります。ブレークポイントは、ストラクチャ、ノード、ワイヤに配置することができます。
ストラクチャブレークポイント
以下の図は、Forループにブレークポイントを配置した状態を示しています。VIはForループ全体の実行が完了する前に一時停止します。ブロックダイアグラムを囲む赤い枠線でブレークポイントがハイライトされます。ブロックダイアグラムがストラクチャの内側にある場合、ストラクチャ内に赤い枠線が表示されます。ブロックダイアグラムのすべてのノードの実行が完了すると、実行が一時停止します。ブレークポイントがループストラクチャの内側にある場合、各ループの反復が完了する度に一時停止します。
ノードブレークポイント
以下の図は、インクリメントノードにブレークポイントを配置した状態を示しています。VIは「インクリメント」関数の実行前に一時停止します。また、1つのワイヤにブレークポイントが配置されます。VIは「積」関数の完了後に再度一時停止します。ノードを囲む赤い枠線でブレークポイントがハイライトされます。ノードが実行される直前に実行が一時停止します。プローブツールを使用して、すべての入力信号をノードにプローブすることができます。
ワイヤブレークポイント
以下の図は、ワイヤ上にブレークポイントを配置し、それにプローブを付けた状態を示しています。ワイヤ値を保持を選択しておくと、マウスカーソルをワイヤに合わせるたときに、以下の図のようなヒントラベルが表示され、ワイヤ内のデータ値を確認することができます。データがワイヤを通過してプローブが現在の反復のデータを表示した後、実行が一時停止します。ワイヤの中心の赤い枠線でブレークポイントがハイライトされます。ワイヤにプローブを接続すると、プローブも赤い枠線で表示されます。
無効なブレークポイント
以下の図は、Forループと増分ノードにブレークポイントを配置した状態を示しています。これらのブレークポイントはすべて無効にされているので、VIはブレークポイントで一時停止しません。この場合、ブロックダイアグラムオブジェクト周囲の赤枠は、通常より細く表示され、ブレークポイントが無効であることを知らせます。ブレークポイントを有効にすると、赤枠は上の図のような太い幅で表示されます。
実行を中断する
制御器や表示器の値を編集したり、発呼者に返すまでの実行回数を制御したり、また、サブVIの実行開始時点に戻ったりするには、サブVIの実行を中断します。実行を中断した状態でサブVIへのすべての呼び出しを開始したり、サブVIへの特定の呼び出しを中断することができます。
サブVIへのすべての呼び出しを中断するには、サブVIを開き、操作→呼び出されたら中断を選択します。他のVIがそのVIを呼び出すと、サブVIは自動的に中断されます。シングルステップの実行中にこのメニュー項目を選択した場合は、サブVIはすぐには中断されません。サブVIは呼び出されたときに中断されます。
特定のサブVIの呼び出しを中断するには、ブロックダイアグラム上のサブVIノードを右クリックし、ショートカットメニューからサブVIノード設定を選択します。サブVIのそのインスタンスだけで実行を中断するには、呼び出されたら中断チェックボックスをオンにします。
表示»VI階層を選択することによって表示されるVI階層ウィンドウは、VIが一時停止または中断されているかどうかを示します。矢印グリフは、以下のように、通常どおりに実行しているVIまたはシングルステップで実行しているVIを示します。
一時停止グリフは、以下のように、一時停止または中断されているVIを示します。
緑の一時停止グリフ、または白黒の場合中抜きのグリフは、呼び出されたら一時停止するVIを示します。赤の一時停止グリフ、または白黒の場合塗りつぶされたグリフは、現在一時停止しているVIを示します。感嘆符グリフは、以下のように、サブVIが中断されていることを示します。
VIを同時に中断または一時停止できます。
サブVIの現在のインスタンスを決定する
サブVIを一時停止すると、ツールバーのコールしリストプルダウンメニューが、トップレベルVIからサブVIに至るまでの発呼者のチェーンをリストします。このリストは、参照»このVIの発呼者を選択すると表示されるリスト (VIが現在実行中であるかどうかにかかわらず、すべての発呼者VIをリストします) とは異なります。ブロックダイアグラムに複数のインスタンスが含まれている場合にサブVIの現在のインスタンスを調べるには、コールリストメニューを使用します。コールリストメニューからVIを選択すると、そのブロックダイアグラムが開き、現在のサブVIのインスタンスがハイライトされます。
また、「呼び出しチェーン」関数を使用して、現在のVIからトップレベルVIまでの発呼者のチェーンを表示することもできます。
ブロックダイアグラムのセクションをデバッグする
テキストベースのプログラミング言語でコードの一部をコメントアウトするように、ブロックダイアグラムの一部を無効にした状態でVIを実行することができます。ある部分がない方がVIのパフォーマンスが向上するかどうかを調べるには、ブロックダイアグラムのそのセクションを無効にします。無効にするセクションをダイアグラム無効ストラクチャ内に配置します。
また、コードの一部をデバッグして問題を特定することもできます。コードの一部をデバッグするには、デバッグするコード部分を条件無効ストラクチャ内に配置します。
計測
コードのデバッグにプローブ、ブレークポイント、実行のハイライトを使用すると時間がかかる場合は、計測VIを作成します。計測VIによって、VIの実行を観察して問題をデバッグすることができます。
デバッグするVIからデータを読み取り、結果レポートを生成するような計測VIを作成します。この計測VIでは、デバッグするコードの部分を指定し、デバッグするVIへのパスを指定し、時間ステップを使用します。
計測VIは、ブロックダイアグラムのデータの実行順序を示す点で、Desktop Execution Trace (デスクトップ実行トレース) ツールキットと似ています。
オブジェクトの動作を確認する
VIまたはブロックダイアグラムのデータフローに関する問題は、デバッグツールを使用するだけではなく、以下の方法でも特定、修正することができます。
- 制御器や表示器の表記法をチェックし、浮動小数点数を整数に変換したり、整数をそれより小さい整数に変換することによってオーバーフローが返されていないかを確認します。たとえば、8ビット整数しか受け入れない関数に16ビット整数を配線したとします。これにより関数は16ビット整数を8ビットの表記法に変換しますが、データ損失が発生する可能性があります。詳細については、不定データを回避するを参照してください。
- ある関数またはサブVIが渡すデータが未定義かどうかを確認します。この現象は数値のデータの場合に頻繁に発生します。たとえば、VIのあるポイントで数値がゼロで除算される可能性があると、次の関数またはサブVIでは数値が予想される一方でInf (無限) が返される場合があります。
- Forループが誤って反復回数"0"で実行されたために空の配列が生成されていないかどうかを確認します。詳細については 実行のハイライトおよび不定データを回避するを参照してください。
- ループの反復から次の反復までデータを保存したい場合を除いて、シフトレジスタプロパティを初期化することを確認します。
- 接続元および接続先のクラスタ要素の順番を確認します。LabVIEWは編集時にデータタイプおよびクラスタサイズの不一致を検出しますが、同じタイプの要素の不一致は検出しません。
- VIに非表示のサブVIがないことを確認します。たとえば、別のノードの上にサブVIを直接配置したり、ストラクチャをサイズ縮小することで、知らないうちにサブVIが見えなくなっている場合があります。VIが表示»関係を参照»このVIのサブVIおよび表示»関係を参照»開かれていないサブVIの結果に対して使用するサブVIの一覧をチェックして、余分なサブVIが存在するかどうかを判断します。
- 表示»VI階層を選択し、未配線のサブVIを検索します。未接続のVIは、未接続の関数とは異なり、必須に構成された入力を持たない限りは、エラーが発生しない可能性があります。ブロックダイアグラムに未配線のサブVIを誤って配置すると、ダイアグラムの実行時にそのサブVIが実行されます。その結果、VIは余分な動作を実行する可能性があります。
- 詳細ヘルプウィンドウを使用して、ブロックダイアグラムの各関数およびサブVIのデフォルト値を確認します。オプションまたは推奨の入力が未配線の場合、VIおよび関数はデフォルト値を渡します。たとえば、ブール入力は未配線の場合TRUEに設定される場合があります。