更新日: 14/03/27

Absoft Fx3 デバッガ入門

  1. デバッグの準備
    1. コンパイラのオプション設定
    2. デバッグの開始

  2. デバッグ
    1. 準備
    2. シングルステップ
    3. ブレークポイントの使い方
    4. 変数の表示
    5. 変数の変更
    6. OpenMP プログラムのデバッグ
    7. スレッドの取扱い
    8. デバッグのヒント

 

デバッグの準備

ここでは、Fx3 デバッガを使ってデバッグを行うための準備と、その開始方法について説明します。ブレークポイントやシングルステップ操作、変数チェックの仕方について説明します。

Fx3 デバッガだけでなくあらゆるソースレベルデバッガは、ソースコード内に埋め込まれ、デバッグ時に使用されるシンボル情報が必要となります。通常すなわちデバッグを行わない場合は、初期段階でコンパイラの構文解析と辞書解析にこの情報が使用され、オブジェクトファイルの段階で破棄されます。したがってデバッグの準備作業として、このシンボル情報と行番号を記録したオブジェクトファイルを作成するように、コンパイラとリンカのオプションを設定する必要があります。

 

コンパイラのオプション設定

Absoft を含むすべてのコンパイラでは、-g オプションを使ってオブジェクトファイルにシンボル情報と行番号を記録します。デバッグしたいソースコードすべてに対して、このオプションを有効にする必要があります。そうではないコードに対しては、不要です。オペレーティングシステムの情報に関しては、付録を参照して下さい。

Absoft Develper Tools Interface を使用している場合は、Active BuildDebug に切換えて、デバッグモードにしてアプリケーションをビルドしてください。

デバッグする場合は、最適化オプションの類はすべて OFF にしておいて下さい。最適化は、プログラム実行文の順番を変えたり、全体構造を変化させてしまうからです。すなわち、ループを展開するためにコードを削除あるいは追加したり、変数を削除したり、レジスタに確保したり (値を変更することができなくなります) して、当初の実行順序を変えてしまいます。

 

デバッグの開始

Fx3 デバッガは、他のアプリケーションプログラムと同様に起動することができます。Fx3 デバッガのアイコンをダブルクリックまたはシェルのコマンドプロンプトで「Fx3」と入力します。

Fx3 デバッガを起動したら、オプションすなわちデバッガの起動オプション、デバッグするプログラム名、プログラムコード実行の際にとる引数などを設定します。

Fx3 のアイコンをダブルクリックして起動した、あるいは実行ファイル名を指定せずコマンドラインで起動した場合は、Fx3 デバッガの FileOpen メニューコマンドをクリックして、デバッグするアプリケーションを指定して下さい。

最初に表れるウィンドウには Load Program パネルがあり、コマンドラインでの引数を記述することができます。

Fx3 デバッガがシンボル情報とアプリケーションプログラムを読み込むと、コードの初期化を実行し、メインプログラム実行文の第1行からデバッグが開始できる状態になります。

Fx3 デバッガのメインウィンドウは、2つのセクションで構成されます。上部セクションには、ソースファイルが表示されます。ファイル名毎にタブが付けられ、さらにいくつかのセクションに分割されます。下部セクションには、ユーザー変数、ブレークポイント、スタック情報とコンソールウィンドウが表示されます。やはり関数名のラベルが付くいくつかのセクションに分割されます。

Console タブを開くと、最初に設定しなかったコマンドを Fx3 に渡して、すべてのコマンドの実行結果を得ることができます。Fx3 のコマンド一覧は、マニュアルの最後に記載されています(Command Arguments および Command Reference 参照)。

Debug メニューの Step Into または Step Over コマンドを選択すると、実行文を1行ずつ実行することができます。Step Into はサブルーチン呼び出しや関数の参照も 1行ずつ実行しますが、 Step Over はそこまで追わずただ 1行の命令文として実行します。Return コマンドは、サブルーチンや関数の残りの実行文をすべて 1行の命令文として実行し、呼び出したポイントに戻ります。これらのコマンドは、メニューだけではなくツールバーボタンで実行することも可能です。

ブレークポイントは、ソースウィンドウ(ソースコードの行番号が書かれたウィンドウ)の左端に矢印のポインタを移動すると設定できます。矢印のポインタをこのエリアに設定し、マウスボタンを左クリックすると、ソースコードの中にブレークポイントが設定されます。ブレークポイントが設定されると、行番号に赤の印が付きます。ブレークポイントを設定した行の上で、再度マウスの左クリックを行うとブレークポイントが解除されます。

変数その他の項目は、Fx3 デバッガのメインウィンドウ下部に表示されたタブを選択して、調べたり変更することができます。3種類の変数が、それぞれ LocalsWatchArguments というタブで表示されます。

数値型式は、変数タブを開き、Value 列の中の値を選択、マウスの右クリックをして Format メニューで変更することができます。

 

デバッグ

ここでは、デバッグの基本すなわちシングルステップのデバッグとブレークポイントについて説明します。デバッグの基本は、プログラムを分割して、デバッグしなければならない場所をいかに見つけ出すかということでもあります。

 

準備

デバッグを開始する前に、これまでに述べてきたことをしっかりと復習しておいて下さい。すなわち、プログラムのコンパイルとリンクの仕方、デバッグの準備作業についてです。Fx3 デバッガを起動すると、ソースコードウィンドウが以下の例のように表示されるでしょう。

ウィンドウの左端は、ソースファイルのコメント文、定義文、実行文などの行番号です。プログラムの実行がストップしたカレント行は、緑色のポインタで表示されています。

行番号の上または実行文上でマウスの左クリックをすると、ブレークポイントが設定されます。ブレークポイントについては、あとで詳しく述べます。

ウィンドウ内で変数の値は、枠に囲まれて表示されていることに注意して下さい。マウスカーソルを変数の上に持って行くと、このように表示されます。変数が配列の要素である場合は、最初に配列名、つぎに添え字を選択し、値を見たい場所にマウスを持って行って下さい。

 

シングルステップ

シングルステップとは、プログラムを 1行だけ実行し、次の行頭で実行を止めることを意味します。1行の中に複数の実行文が書かれている場合は、それらすべて文を 1行とみなして実行します。1つの実行文が複数行に書かれている場合は、それらすべての行を 1行とみなして実行し、次の行頭で止まります。

行の中にサブルーチンの呼び出し、あるいは関数の参照がある場合は、サブルーチンや関数の実行文を 1行ずつ追いかけるか、または 1行の実行文としてデバッグを進めるか選択することができます。サブルーチンや関数に間違いがないことがはっきりしている場合は、それらのプロシージャを 1行の実行文とみなし、デバッグを進めます(Step Over コマンド)。サブルーチンや関数が信頼できない場合は、Step Into コマンドを使って、それらのプロシージャもデバッグを行います。途中で考えを変えた場合は、Return コマンドを選択してサブルーチンや関数の残りプロシージャを実行し、呼び出したポイントに戻ります。

 

ブレークポイントの使い方

シングルステップのデバッグは、たくさんのループや繰り返し構造をもつ長いプログラムでは、非常に面倒です。そこで、怪しい個所までは通常通りに実行し、調べたい個所だけデバッグをするというやり方が、はるかに効率的です。その目的のためにブレークポイントを使用します。すなわちブレークポイントは、プログラム実行を止めるポイントです。プログラマ自身がそのポイントを設定し、そのポイントに到達するまではプログラムは通常通り実行されます。到達したら、デバッガを使用してコードをチェックすることができます。

Fx3 デバッガでは、行番号または実行文の上にマウスポインタを置き、左ボタンをクリックするとブレークポイントが設定されます。

ブレークポイントを削除するには、ブレークポイントが設定された行番号の上で、設定するときと同じようにマウスの左クリックをすると、削除されます。

メインウィンドウ下部の Breakpoints タブをクリックすると、すべてのブレークポイントが表示されます。

最初の Id フィールドは、ブレークポイントの数を表します。Id は、それ以下のブレークポイントの条件を設定するために使用されます。Address フィールドには、ブレークポイントが設定された命令のアドレスが入ります。FileNumber Line フィールドは、ブレークポイントが設定されたファイル名と行番号を示します。Enabled フィールドは、ブレークポイントが有効(y)か無効(n)かを表しています。ブレークポイントに何か条件が設定されている場合は、Condition フィールドにその条件が表示されます。Times フィールドは、プログラムの実行を中止しなかったブレークポイントの回数を示します。Ignore フィールドには、ブレークポイントを無視する設定がある場合、その回数が表示されます。ブレークポイントのフィールドのどれかをダブルクリックをすると、ソースコードウィンドウに該当するブレークポイント命令文が表示されます。

ブレークポイントに到達しプログラム実行を停止する前に、さらに条件を設定することができます。何回も同じ命令文を実行するような場合は、これは大変便利です。コンソールタブをクリックして、次のようにブレークポイントに条件を設定することができます。

  1. Console ウィンドウを選択し、コマンド入力のフィールドに条件を設定します。Breakpoints タブをクリックし、ブレークポイントの Id 番号を使用して記述します。

  2. Commands のフィールドに、以下のように条件を入力します。
    condition 3 ((yag(1) .LT. 150) .OR. (yag(10) .GR. 1000))

コマンドの詳細は、Fx3 Debugger User guide の Command Reference の章を参照して下さい。

 

変数の表示

Fx3 デバッガは、プログラムが使用する変数に関する情報を、いくつかのタブに表示します。サブルーチンまたは関数の使用するローカル変数は Locals タブに、サブルーチン/関数に渡す引数は Arguments タブ、ユーザーが特に指定した変数は Watch タブに表示されます。

どの変数タブも、シンボル名、アドレス、データ型と現在の値を表示します。Fortran90 派生型または構造体のような集合型データの場合は、シンボル名に付いている + ボタンをクリックすると、データメンバーが表示されます。シンボルが配列の場合は、ダブルクリックをすると配列要素が表示されます。

デフォルト設定では、変数の値は変数のデータ型の通りに表示されます。値を選択し、マウスの右クリックで表示される Format メニューで、データの表示形式を変更することができます。

これらの表示枠は、区切りの枠線をマウスでドラッグしてサイズを変更することができます。

 

変数の変更

Watches タブのパネルに表示された変数の値は、マウスの左ボタンをその上でダブルクリックして、変更することができます。値は濃い青色の編集フィールドに表示されます。既存の値を新たなデータ型、値に編集することができます。式を入力した場合は、Fx3 デバッガがそれを評価します。

値フィールド内では、Undo (Ctrl+Z) を含むショートカットキーを使用することもできます。

 

OpenMP プログラムのデバッグ

Fx3 デバッガは、スレッドの状態も追跡することができるので、OpenMP コードのデバッグが可能です。ブレークポイントまたはソースコードの命令で OpenMP プログラムが停止すると、Threads タブを使ってカレントスレッドのデバッグが行えます。

Threads パネルにリストされたスレッドを選択しダブルクリックすると、デバッグ対象(カレント)のスレッドになります。Fx3 デバッガのその他のタブは、このスレッドの状態を示すように変更されます。

OpenMP ディレクティブの先頭で OpenMP プログラムが停止している場合は、Step Over コマンドを使って OpenMP ディレクティブ全体を 1行の命令として実行することも、あるいは Step Into コマンドでスレッドのコードをデバッグすることもできます。

複数のスレッドが走るプログラムをデバッグする場合は、Fx3 デバッガはすべてのスレッドを同時に再開することも、ブレークポイントまたはソースコードの停止ポイントで停止させることもできます。Fx3 デバッガの制御変数 %steponlycurrent の値を 1 に設定することで、この振る舞いを変更することができます。%steponlycurrent の値を 1 にすると、Step Into または Step Over コマンドを実行したとき、デバッグ中のカレントスレッドのみ再開します。ただしこうすると、デバッグ中のスレッドが再開されていない他のスレッドからのメッセージ待ちの状態になって、ハングすることもあり得ますので注意が必要です。

 

スレッドの取扱い

OpenMP またはマルチスレッドのアプリケーションをデバッグする際、 Fx3 デバッガにはいくつかのスレッド操作コマンドが用意されています。すなわち Threads パネルでマウスの右クリックをし、表示されたコンテキストメニューなどを使って、個々のスレッドをフリーズ(Freeze)させたり解凍(Thaw)させることができます。フリーズしたスレッドは、関数の戻り値やソースコードの実行位置にきても、再開させることはできません。また Breakpoints パネルの Threads 列を使って、ブレークポイントを特定のスレッドのみに制限することができます。1つのスレッドの場合はスレッド Id で、複数のスレッドの場合は t:[start_thread_id:end_thread_id] と記述することができます。

 

デバッグのヒント

Fx3 デバッガは、プログラマに代わってデバッグをしてくれるのではなく、プルグラムエラーや論理ミスの情報をプログラマに提供するためのツールです。有用な情報を得るためには、そのためのよい設定を行う必要があります。ここでは、デバッグを行う際のガイドラインや役に立つ情報を述べます。