dbx コマンドによるデバッグ ホーム目次前ページへ次ページへ索引


第 10 章

データの視覚化

Sun Workshop でプログラムをデバッグするときに、データをグラフィック表示させる必要がある場合は、データの視覚化を行います。

データの視覚化機能はデバッグに最適です。サイズが大きく複雑なデータセットでも容易にチェックや確認ができ、結果をシミュレーションしたり、計算結果を対話的に操作できます。「データグラフ」ウィンドウでは、プログラムデータを「見る」ことができ、グラフィカルにデータを解析できます。グラフの印刷やファイルへの出力が可能です。

この章は、次の各節から構成されています。

適切な配列式の指定

データを表示させるには、配列とその表示方法を指定する必要があります。「デバッグ」ウィンドウで「式」フィールドに配列名を入力して、「データグラフ」ウィンドウを呼び出します。Sun WorkShop オンラインヘルプの「デバッグウィンドウの使い方」の「配列の評価」を参照してください。複雑な (Fortran) 配列型を除く、すべてのスカラ配列型がサポートされています。

一次元の配列は、x 軸にインデックス、y 軸に配列値を示したグラフ (ベクトルグラフ) になります。二次元の配列のデフォルトのグラフ表示 (エリアグラフ) は、 x 軸で第 1 次元のインデックス、y 軸で 第 2 次元のインデックス、z 軸で配列値を示したグラフになります。n 次元の配列をグラフ表示できますが、これらの次元の中で変更できるのは、 2 つまでです。

データセット全体を調べる必要はありません。次の例で示すように、配列の断面を指定するだけで済みます。図 10-1 と図 10-2 は、この章の最後にある Fortran のサンプルプログラムの bf 配列を示しています。


図 10-1   bf 配列名のみのグラフ (左)、bf (0:3,1:20) のグラフ (右)

次の 2 つの図は、指定された値の範囲の配列を示したものです。


図 10-2   配列 bf : bf (3,:) (左)、bf (:,7) (右)

配列グラフの作成

ソースコード内の式を選択してグラフ化すれば、アプリケーションの実行時にさまざまなポイントを比較できます。グラフでは、プログラムのどこに問題があるかを調べることができます。「データグラフ」ウィンドウでは、配列をグラフ化し、同じデータをさまざまな視点から検討することができます (Sun WorkShop オンラインヘルプの「デバッグウィンドウの使い方」の「データグラフウィンドウ」参照)。

Fortran の複雑な配列以外すべてサポートしています。

配列グラフ作成の準備

配列のグラフを作成するには、次のように操作します。

1. 次のいずれかの操作で、「デバッグ」ウィンドウにプログラムを読み込みます。

2. プログラムに少なくともブレークポイントを 1 つ設定します。

この場合、ブレークポイントはプログラムの最後に 1 つ設定するか、任意の場所に 1 つ以上設定します (Sun WorkShop オンラインヘルプの「デバッグウィンドウの使い方」の「ブレークポイント (行に設定)」参照)。

3. プログラムを実行します。

(Sun WorkShop オンラインヘルプの「デバッグウィンドウの使い方」の「プログラムの開始」参照)。

ブレークポイントでプログラムが停止したら、調べる配列を選択します。

さまざまな配列グラフの作成

以上でグラフ作成の準備ができました。Sun WorkShop ではさまざまな方法でグラフを作成できます。

配列表示の自動更新

配列式の値は、プログラムの実行につれて変化します。配列式の新しい値をプログラムの指定個所に表示するか、一定の時間間隔で表示するかを、「デバッグオプション」ダイアログの「データグラファ」タブの「更新」セクションで選択できます (Sun WorkShop オンラインヘルプの「デバッグウィンドウの使い方」の「データグラファのデフォルト設定」参照)。

プログラムがブレークポイントで停止するごとに配列の値を更新させる場合は、「更新時期」の「プログラム停止」オプションをオンにする必要があります。このようにすると、プログラムが進行していく段階で、各停止位置ごとの配列値を見ることができます。このオプションは、各ブレークポイントでデータの変更を表示させる場合に使用します。この機能は、デフォルトではオフに設定されています。

実行時間が長いプログラムの場合は、「更新時期」の「一定間隔で」オプションを選択すると、時間の経過とともに変化する配列値の変化を見ることができます。一定間隔での更新を使用すると、タイマーが一定 (n) の間隔ごとに自動的に設定されます。この間隔はデフォルトでは、1 秒に設定されています。デフォルトの設定を変更する場合は、「グラフ」 「デフォルトオプション」を選択し、「デバッグオプション」ダイアログボックス内の更新時間間隔を変更します (Sun WorkShop オンラインヘルプの「デバッグウィンドウの使い方」の「更新された配列値の表示」参照)。


注 - タイマーに設定された一定の間隔ごとに、Sun Workshop はグラフ表示の更新を行いますが、配列がこの特定の時間に範囲外にある場合は、更新は行われません。

また、タイマーは、データ収集、メモリーリークまたはアクセス検査時にも使用されるため、標本コレクタまたは実行時検査の実行中には、一定間隔での更新は設定できません。

表示の変更

データがグラフィック表示されたら、「データグラフ」ウィンドウ内のコントロールを使って表示画面の調整やカスタマイズが行えます。この節では、ユーザーが試してみるることができるグラフ表示の例をいくつか示します。

どのようなタイプの配列でもそれをグラフ化するときに、「データグラフ」ウィンドウを開くと、「拡大」と「縮小」オプションが表示されています。エリアグラフの場合は、このウィンドウには「軸回転」と「遠近率」フィールドが組み込まれます。これらのオプションを使用すると、その軸を回転させたり、奥行きを増減することによってグラフの表示を変更できます。グラフを簡単に回転させるには、グラフ上にカーソルを置いてマウスの右ボタンを押し、そのままグラフをドラッグします。また、各軸の回転の角度を、「軸回転」フィールドで指定することもできます。

これ以外のオプションを表示させる場合は、「オプション表示」ボタンをクリックします。オプションがすでに表示されている場合は、「Hide」をクリックしてその他のオプションを非表示にしてください。

図 10-3 は、同じ配列を 2 種類の表示画面で示したものです。左の図では、配列は、「ワイヤーメッシュ」構造の「表面」グラフタイプで表示されています。右の図では、配列は、「範囲線」によって輪郭を描く「等高線」グラフタイプで表示されています。


図 10-3   同じ配列の2種類の表示画面

「等高線」グラフタイプを選択すると、「範囲」オプションで、どのエリアのデータ値が変化したかが解ります。

「表面」グラフタイプの表示オプションには、「テクスチャー」、「シェーディング」、「塗りつぶし」があります。

「表面」グラフのテクスチャーの選択肢には、図 10-4 に示す「ワイヤーメッシュ」と「範囲線」があります。


図 10-4   ワイヤーメッシュ (左) と 範囲線 (右) の 「表面」グラフ

「表面」グラフのシェーディング選択肢には、図 10-5 に示す「光源」と「範囲色」があります。


図 10-5   「光源」(左) と「範囲色」(右) の 「表面」グラフ

図 10-6 のように、グラフの領域に陰影を付けたり、表面を塗りつぶしたグラフを作成するには、「塗りつぶし」をオンにします。


図 10-6   陰影付き (左) と表面を塗りつぶした (右) 「表面」グラフ

データ範囲線で面グラフを表示するにはグラフタイプに「等高線」を選択します。図 10-7 のように、「等高線」グラフには、グラフをラインとカラーのいずれか、またはその両方で表示するオプションがあります。


図 10-7   ライン (左)、カラー (中央)、両方 (右) による「等高線」グラフ

表示するデータの値の範囲を変更するには、「範囲: 分割数」テキストボックスの値を変更します。

図 10-8   「範囲: 分割数」が (左から右に) 5、10、15 の「等高線」グラフ

分割数を大きくすると、カラーマップに悪影響が出ることがあります。

範囲の間隔の凡例を表示するには、「範囲の凡例を表示」ボタンをクリックします。

視覚化されたデータの分析

視覚化されたデータの更新方法は、更新内容によって異なります。たとえば、その必要に応じて、ブレークポイントで更新することも指定した時間間隔で更新することもできます。変更内容を表示したり、最終的な結果を分析したりすることができます。この節では、さまざまなシチュエーションのシナリオを想定しています。

Sun Workshop には、dg_fexamp (Fortran) と dg_cexamp (C) の 2 つのサンプルプログラムが付属しています。データの視覚化を説明する以下のシナリオの中で、この 2 つのサンプルプログラムを使用します。

また、これらのプログラムは練習用にも使用できます。このサンプルプログラムは、install-dir/SUNWspro/WS6/examples/gatecrasher にあります。デフォルトの install-dir は /opt です。このプログラムを使用する場合は、このディレクトリに移動して、make と入力すると、実行可能プログラムが作成されます。

シナリオ 1: 同じデータを違う視点で表示させて比較する

同じデータを何回でもグラフ化できるため、グラフタイプを変えたり、データのセグメントを変えたりして比較できます。

1. C または Fortran のサンプルプログラムをロードします。

2. プログラムの最後にブレークポイントを設定します。

(Sun WorkShop オンラインヘルプの「デバッグウィンドウの使い方」の「ブレークポイント (行に設定)」参照)。

3. プログラムを起動し、ブレークポイントまで実行します。

4. 「デバッグ」ウィンドウの「式」フィールドに bf と入力します。

5. 「データ」 「式をグラフ表示」を選択します。

bf 配列の両方の次元の表面グラフが表示されます。

6. もう一度「データ」 「式をグラフ表示」を選択し、もう 1 つ同じグラフを表示します。

7. 「データグラフ」ウィンドウのどれかで、「オプション表示」をクリックし、グラフタイプで「等高線」ラジオボタンを選択します。

こうして、同じデータを異なるグラフタイプで表示して比較します。

8. サンプルプログラムが Fortran の場合は bf (1,:)、C の場合は bf[1][..] と「式」テキストボックスに入力します。

9. 「データ」 「式をグラフ表示」を選択し、bf 配列におさめられたデータセクションのグラフを表示します。

データを以上のさまざまなグラフに表示して比較できます。

シナリオ 2: データのグラフを自動的に更新する

「デバッグオプション」ダイアログの「データグラファ」タブの「更新: プログラムが停止したとき」オプションをオンにすると、グラフの更新を自動制御できます。これは、プログラム実行中のデータの変化を比較するための機能です。

1. C または Fortran のサンプルプログラムを読み込みます。

2. bf 関数の外側のループの最後にブレークポイントを設定します。

(Sun WorkShop オンラインヘルプの「デバッグウィンドウの使い方」の「ブレークポイント (行に設定)」参照)。

3. プログラムを起動し、ブレークポイントまで実行します。

(Sun WorkShop オンラインヘルプの「デバッグウィンドウの使い方」の「プログラムの開始」参照)。

4. 「デバッグ」ウィンドウの「式」テキストボックスに bf と入力します。

5. 「データ」 「式をグラフ表示」を選択します。

最初のループ結果が表示されると、bf 配列の値がグラフで表示されます。

6. 「オプション表示」をクリックし、「更新時期: プログラム停止」チェックボックスを選択します。

7. 「実行」 「継続」を選択し、さらにこのプログラムを数ループ実行します。

プログラムがブレークポイントで停止するたびに前回のループで設定された値でグラフが更新します。

ブレークポイントごとに最新のデータによるグラフを表示する場合、この自動更新機能を使用すれば、手間が省けます。

シナリオ3: プログラムの異なる個所のデータグラフを比較する

グラフは、手動でも更新できます。

1. C または Fortran のサンプルプログラムを読み込みます。

2. af 関数の外側のループの最後にブレークポイントを設定します。

(Sun WorkShop オンラインヘルプの「デバッグウィンドウの使い方」の「ブレークポイント (行に設定)」参照)。

3. プログラムを起動し、ブレークポイントまで実行します。

(Sun WorkShop オンラインヘルプの「デバッグウィンドウの使い方」の「プログラムの開始」参照)。

4. 「デバッグ」ウィンドウの「式」テキストボックスに af と入力します。

5. 「データ」 「式をグラフ表示」を選択します。

最初のループ結果が表示されると、af 配列の値がグラフで表示されます。このグラフでは自動更新がオフになっていることを確認してください (デフォルトの設定)。

6. 「実行」 「継続」を選択し、このプログラムをもう 1 ループ実行します。

7. 「データ」 「式をグラフ表示」を選択し、af 配列のグラフをもう 1 つ表示します。

このグラフのデータ値は、外側のループの 2 番めの実行時に設定された値です。

これで、af 配列の 2 つのループ実行に使用されたデータを比較することができます。自動更新をオフにしたグラフは、自動、または手動で連続的に更新されるグラフの基準グラフとして使用できます。

シナリオ 4: 同じプログラムを別々に実行した結果のデータグラフを比較する

同じプログラムを複数回実行させる場合、次にそのプログラムを実行させるまで前のデータグラフが画面に残っています。前にプログラムを実行したときのデータから作成したグラフは、手動で更新するか、または自動更新機能がオンになっていない限り上書きされません。

1. C または Fortran のサンプルプログラムをロードします。

2. プログラムの最後にブレークポイントを設定します。

(Sun WorkShop オンラインヘルプの「デバッグウィンドウの使い方」の「ブレークポイント (行に設定)」参照)。

3. プログラムを起動し、ブレークポイントまで実行します。

(Sun WorkShop オンラインヘルプの「デバッグウィンドウの使い方」の「プログラムの開始」参照)。

4. 「デバッグ」ウィンドウの「式」テキストボックスに vec と入力します。

5. 「データ」 「式をグラフ表示」を選択します。

(正弦波曲線で) vec 配列のグラフが表示されます。

6. これでプログラムを編集できます (sin を cos に置き換えるなど)。修正継続機能 (第 11 章参照)でプログラムを再コンパイルし、処理を続けます (「修正」ツールバーボタンをクリックします)。

7. プログラムを再起動します。

自動更新機能がオフになっているため、プログラムがブレークポイントに達しても前回のグラフは更新されません。

8. 「データ」 「式をグラフ表示」を選択します (「式」テキストボックスの値は引き続き vec です)。

前回のグラフの横に、現在の vec 値のグラフが表示されます。

これで、プログラムを 2 回実行してできたグラフを比較できます。前回プログラムを実行して作成されたグラフは、「グラフ更新」ボタンで手動で更新するか、自動更新機能をオンにしている場合にだけ変更されます。

Fortran のサンプルプログラム

real x,y,z,ct
real vec(100)
real af(50,50)
real bf(-3:3,-10:20)
real cf(50, 100, 200)

 
do x = 1,100
            ct = ct + 0.1
            vec(x) = sin(ct)
enddo

 
do x = 1,50
           do y = 1,50
              af(x,y) = (sin(x)+sin(y))*(20-abs(x+y))
           enddo
 enddo

 
do x = -3,3
          do y = -10,20
            bf(x,y) = y*(y-1)*(y-1.1)-10*x*x*(x*x-1)
          enddo
enddo

 
do x = 1,50
          do y = 1,100
            do z = 1,200
              cf(x,y,z) = 3*x*y*z - x*x*x - y*y*y - z*z*z
            enddo
          enddo
enddo

 
end

C のサンプルプログラム

#include <math.h>
main()
{
    int x,y,z;
    float ct=0;
    float vec[100];
    float af[50][50];
    float bf[10][20];
    float cf[50][100][200];

 
    for (x=0; x<100; x++)
    {
          ct = ct + 0.1;
          vec[x] = sin(ct);
    }
    for (x=0; x<50; x++)
    {
          for (y=0; y<50; y++)
          {
          af[x][y] = (sin(x)+sin(y))*(20-abs(x+y));
          }
    }
    for (x=0; x<10; x++)
    {
          for (y=0; y<20; y++)
          {
            bf[x][y] = y*(y-1)*(y-1.1)-10*x*x*(x*x-1);
          }
    }
    for (x=0; x<50; x++)
    {
          for (y=0; y<100; y++)
          {
          for (z=0; z<200; z++)
          {
                    cf[x][y][z] = 3*x*y*z - x*x*x - y*y*y - z*z*z ;
          }
          }
    }
}


サン・マイクロシステムズ株式会社
Copyright information. All rights reserved.
ホーム   |   目次   |   前ページへ   |   次ページへ   |   索引