Fortran プログラミングガイド ホーム目次前ページへ次ページへ索引


第 5 章

プログラムの解析とデバッグ

この章では、プログラムの解析とデバッグを容易にする Sun Fortran コンパイラの機能について説明します。

大域的なプログラムの検査 (-Xlist)

-Xlistx オプションは、ソースプログラムに不整合がないか、実行時に発生しそうな問題がないかを解析します。コンパイラが行う解析は、大域的に、つまり副プログラム間で行われます。

-Xlists は、境界整列のエラー、副プログラムの引数、共通ブロック、パラメータの数や型の対応のエラー、およびその他のさまざまな種別のエラーを報告します。

-Xlistx はまた、詳細なソースコードのリストとクロスリファレンステーブルも作成します。


注 - f95 では、-xlist サブオプションのすべてを使用できるわけではありません。

GPC の概要

大域的なプログラムの検査 (GPC) は、-Xlistx オプションで呼び出され、次のことを行います。

さらに具体的には、大域的なチェック機能によって次のような問題が報告されます。

大域的なプログラム検査の起動方法

-Xlist オプションをコマンド行に指定すると、コンパイラの大域的なプログラムアナライザが起動されます。以降の節では、-Xlistx のサブオプションについて説明します。

例 : 基本的な大域的なプログラム検査用に 3 つのファイルをコンパイルします。

demo% f95 -Xlist  any1.f  any2.f  any3.f

上記の例では、コンパイラは次のことを行います。

画面への出力

通常、-Xlistx によって生成される出力リストはファイルに書き込まれます。直接画面に表示するには、-Xlisto を使用して、出力ファイルを /dev/tty に書き込みます。

例 : 端末に表示します。

demo% f77 -Xlisto /dev/tty  any1.f 

デフォルトの出力機能

-Xlist オプションは、出力で利用できる機能を組み合わせたものです。他の -Xlist オプションを指定していない場合は、デフォルトで次のことを行います。

ファイル形式

検査プロセスは、コンパイラコマンド行に指定されたすべてのファイル (接尾辞 .f、
.f90、.f95、.for、.F、.F95、.o
の付くファイル) を認識します。.o ファイルは、サブルーチンと関数の名前など、大域的な名前に関する情報だけをプロセスに提供します。

解析ファイル (.fln ファイル)

-Xlist オプションでコンパイルされたプログラムには、自動的にその解析ファイルがバイナリファイル中に構築されます。それによって、ライブラリのプログラム間で大域的なプログラム検査を行うことができます。

また、コンパイラは、-Xlistflndir オプションが指定されている場合でも、個々のソースファイルの解析結果を.fln 接尾辞の付いたファイルに保存します。dir はこれらのファイルを受信するディレクトリを示します。

demo% f77 -Xlistfln/tmp *.f

-Xlist と大域的なプログラム検査の例

次の例で使用される Repeat.f ソースコードを示します。

demo% cat Repeat.f
    PROGRAM repeat
      pn1 = REAL( LOC ( rp1 ) )
      CALL subr1 ( pn1 )
      CALL nwfrk ( pn1 )
      PRINT *, pn1
    END ! PROGRAM repeat

 
    SUBROUTINE subr1 ( x )
      IF ( x .GT. 1.0 ) THEN
        CALL subr1 ( x * 0.5 )
      END IF
    END

 
    SUBROUTINE nwfrk( ix )
      EXTERNAL fork
      INTEGER prnok, fork
      PRINT *, prnok ( ix ), fork ( )
    END

 
    INTEGER FUNCTION prnok ( x )
      prnok = INT ( x ) + LOC(x)
    END

 
    SUBROUTINE unreach_sub()
      CALL sleep(1)
    END

例 : -XlistE を使用してエラーと警告を表示します。

demo% f77 -XlistE -silent Repeat.f
demo% cat Repeat.lst
FILE  "Repeat.f"
program  repeat
     4             CALL nwfrk ( pn1 )
                                  ^
**** エラー  #418:  引数 "pn1" は real ですが、仮引数は integer です。
                 Repeat.f の 14 行目を参照してください。
     4             CALL nwfrk ( pn1 )
                                  ^
**** エラー  #317:  変数 "pn1" は integer** として 21行目の 
repeat/nwfrk//prnok の中で参照されていますが、real として repeat によっ
て 2 行目で設定されています。
subroutine  subr1
    10              CALL subr1 ( x * 0.5 )
                             ^
**** 警告  #348:  再帰的 "subr1"。動的呼び出しを参照してください:
                Repeat.f の 3 行目の再帰呼び出し
subroutine  nwfrk
    17             PRINT *, prnok ( ix ), fork ( )
                                     ^
**** エラー  #418:  引数 "ix" は integer** ですが、仮引数は real です。
                 Repeat.f の 20 行目を参照してください。
subroutine  unreach_sub
    24         SUBROUTINE unreach_sub()
                                      ^
**** WAR  #338:  subroutine "unreach_sub" はプログラムから呼び出され
ません。
日付:     (水) 2 月 24 日 10:40:32 1999
ファイル:      2 個 (ソース 1 個、ライブラリ 1 個)
行:          26 行(ソース 26 個、ライブラリ副プログラム 2 個)
ルーチン:      5 個(MAIN 1 個、 サブルーチン 3 個、 関数 1 個)
メッセージ:    5 (エラー 3 個、 警告 2 個)
demo%

同じプログラムを -Xlist でコンパイルすると、標準出力でクロスリファレンステーブルも生成されます。

  相 互 参 照 表
  ソースファイル:   Repeat.f
凡例:
D        定義 / 宣言
U        単純な使用
M        変更箇所
A        実引数
C        サブルーチン / 関数呼び出し
I        初期設定: DATA または拡張宣言
E        EQUIVALENCE での出現
N        NAMELIST での出現

 
 プ ロ グ ラ ム 形 式)
 プログラム
 -------
repeat          <repeat>        D      1:D 

 
 関数とサブルーチン
 -------------------------
fork     int*4  <nwfrk>        DC     15:D     16:D     17:C 

 
int      intrinsic
                <prnok>         C     21:C 

 
loc      intrinsic
                <repeat>        C      2:C 
                <prnok>         C     21:C 

 
nwfrk           <repeat>        C      4:C 
                <nwfrk>         D     14:D 

 
prnok    int*4  <nwfrk>        DC     16:D     17:C 
                <prnok>        DM     20:D     21:M 

 
real     intrinsic
                <repeat>        C      2:C 

 
sleep           <unreach_sub>            C     25:C 

 
subr1           <repeat>        C      3:C 
                <subr1>        DC      8:D     10:C 
unreach_sub     <unreach_sub>            D     24:D 

f77 -Xlist Repeat.f コンパイルによる出力(続き)

 変数と配列
 --------------------

 
ix       int*4   仮
                <nwfrk>        DA     14:D     17:A 

 
pn1      real*4 <repeat>      UMA      2:M      3:A      4:A      5:U 

 
rp1      real*4 <repeat>        A      2:A 

 
x        real*4 dummy
                <subr1>        DU      8:D      9:U     10:U 
                <prnok>       DUA     20:D     21:A     21:U 

 
---------------------------------------------------------------

 
日付:     (木) 2 月 22 日 13:15:39 1995
ファイル:      2 個(ソース 1 個、ライブラリ 1 個)
行:          26 個(ソース 26 個、ライブラリ副プログラム 2 個)
ルーチン:      5 個(MAIN 1 個、サブルーチン 3 個、関数 1 個)
メッセージ:    5 個(エラー 3 個、警告 2 個)
demo%

上記の例では、クロスリファレンステーブルの意味は次のとおりです。

ルーチン間の大域的な検査を行うサブオプション

大域的にクロスチェックする標準的なオプションは (サブオプションなしの) -Xlist です。このオプションは、それぞれが個別に指定できるサブオプションの組み合わせです。

以降に、リスト、エラー、クロスリファレンステーブルを生成するオプションを説明します。複数のサブオプションをコマンド行に指定することもできます。

サブオプションの構文

サブオプションは次の規則に従って追加します。

-Xlist とサブオプション

サブオプションの組み合せは次の規則に従います。

例 : 次の 2 つのコマンド行は同じ結果を生成します。

demo% f77  -Xlistc  -Xlist  any.f

demo% f77  -Xlistc  any.f

次の表に、これらの基本的な -Xlist サブオプションだけで生成したレポートを示します。

表 5-1   Xlist の個別指定のサブオプション
出力の種類 オプション
エラー、リスト、クロスリファレンス -Xlist
エラーのみ -XlistE
エラーとソースリストのみ -XlistL
エラーとクロスリファレンステーブルのみ -XlistX
エラーとコールグラフのみ -Xlistc


次に、-Xlist のすべてのサブオプションを要約します。

表 5-2   -xlist サブオプションの要約  
オプション 動作
-Xlist
(サブオプションなし)
エラー、リスト、クロステーブルを表示する
-Xlistc コールグラフとエラーを表示する (f77 のみ)
-XlistE エラーを表示する
-Xlisterr[nnn] 検証レポートから nnn 番のエラーを削除する
-Xlistf 高速な出力
-Xlistflndir .fln ファイルを dir に置く (f77 のみ)
-Xlisth クロスチェックのエラーの場合、コンパイルを停止する (f77 のみ)
-XlistI include ファイルのリストとクロスチェック
-XlistL リストとエラーを表示する
-Xlistln 改ページを設定する
-Xlisto name -Xlist 出力報告ファイルのリネーム
-Xlists クロスリファレンステーブルから参照されない識別子を削除する (f77 のみ)
-Xlistvn 検査の「厳密度」を設定する (f77 のみ)
-Xlistw[nnn] 出力行の幅を設定する (f77 のみ)
-Xlistwar[nnn] レポートから nnn 番の警告を削除する
-XlistX クロスリファレンステーブルとエラーだけを表示する


-Xlist サブオプションリファレンス

-Xlist サブオプションについて、以下で説明します。サブオプションによっては、f77 だけでしか使用できません。

f77: -Xlistc - コールグラフとルーチン間のエラーを表示
します。

-Xlistc は単独ではリストまたはクロスリファレンスを表示しません。コールグラフは印字可能な文字を使用したツリー形式で生成されます。主プログラムから呼び出されないサブルーチンがあれば、複数のコールグラフが表示されます。各初期値設定プログラムは主プログラムとは切り離して別個に出力されます。

デフォルトではコールグラフは出力されません。

-XlistE - ルーチン間のエラーを表示します。

-XlistE は単独ではクロスルーチンエラーだけを表示し、リストまたはクロスリファレンスを表示しません。

-Xlisterr[nnn] - nnn 番のエラーを抑制します。

リストやクロスリファレンスから番号付きのエラーメッセージを抑制するときに使用します。

たとえば、-Xlisterr338 とすると、338 番のエラーメッセージが抑制されます。nnn が指定されていない場合は、すべてのエラーメッセージが抑制されます。特定のエラーを追加して抑制するときは、このオプションを繰り返して指定します。

-Xlistf - 高速に出力します。

オブジェクトファイルを生成せずに、ソースファイルのリストとクロスチェックレポートを生成し、ソースを検証するときに Xlistf を使用します。

このオプションなしのデフォルトでは、オブジェクトファイルは生成されます。

f77: -Xlistflndir - .fln ファイルを dir ディレクトリに格納します。

-Xlistfln を使用して、.fln ソース解析ファイルを受け取るディレクトリを指定します。指定するディレクトリ (dir) はあらかじめ存在しなければなりません。デフォルトでは、ソース解析情報は .o オブジェクトファイルに直接格納されます (.fln ファイルは生成されない)

f77: -Xlisth - エラーのため停止します。

-Xlisthを使用すると、プログラムのクロスチェック中にエラーが検出された場合に、コンパイルが停止します。この場合の記録は、*.lst ではなく標準出力 stdout にリダイレクトされます。

-XlistI - include ファイルに対してもリストとクロスチェックを行います。

-XlistI サブオプションだけを使用した場合、標準の -Xlist 出力 (行番号付きリスト、エラーメッセージ、クロスリファレンステーブル) とともに、include ファイルも表示または走査されます。

-XlistL - リストとルーチン間のエラーを表示します。

リストとクロスルーチンエラーのみを生成するときに -XlistL を使用します。このサブオプションは単独ではクロスリファレンステーブルを表示しません。デフォルトでは、リストとクロスリファレンステーブルの両方が表示されます。

-Xlistln - ページ割り付けのページ長を n 行に設定します。

ページの長さをデフォルトのページサイズ以外の長さに設定するときに -Xlistl を使用します。 たとえば、-Xlistl45 とすると、1 ページの長さは 45 行になります。デフォルトは 66 行です。

n=0 (-Xlistl0) の場合、このオプションは、改ページをせずにリストとクロスリファレンステーブルを表示します。これは、画面上で表示するときに便利です。

-Xlisto name - -Xlist の出力レポートファイルをリネーム
します。

-Xlisto を使用して、生成されたレポート出力ファイルの名前を変更します。(oname の間には空白文字が必要です。) -Xlisto name と指定すると、出力は name.list ファイルに書き込まれます。

画面に直接表示するときは -Xlisto /dev/tty コマンドを使用します。

f77: -Xlists - 参照されていない識別子を抑制します。

include ファイルで定義されているが、ソースファイルで参照されていない識別子を、クロスリファレンステーブルから抑制します。

このサブオプションは、-XlistI が指定されている場合には効力がありません。

デフォルトでは、#include または INCLUDE ファイルでの出現は表示されません。

f77: -Xlistvn - 検査の厳密度を設定します。

n には 1、2、3、4 のいずれかを設定します。デフォルトは 2 です (-Xlistv2)。

すべての名前についてクロスチェックした情報を行番号のない、簡潔な形式でのみ表示します。検査の厳密度としてはもっとも低いレベルで、構文エラーだけを検査します。

クロスチェックした情報に、注釈と行番号を付けて表示します。検査の厳密度としてはデフォルトのレベルで、構文エラーに加えて、引数の不整合なエラー、変数の使用上のエラーも検査します。

クロスチェックした情報に注釈と行番号を付けて表示し、共通ブロックのマップを表示します。検査の厳密度としては高いレベルで、別の副プログラムにある共通ブロックでデータ型を不正に使用したことによるエラーも検査します。

クロスチェックした情報に、注釈、行番号、共通ブロックのマップ、 EQUIVALENCE ブロックのマップを付けて表示します。最高の検査の厳密度で、最大限のエラーを検出します。

f77 -Xlistw[nnn] - 出力行の幅を n カラムに設定します。

出力行の幅を設定するときに -Xlistw を使用します。たとえば、-Xlistw132 とすると、ページ幅は 132 カラムになります。デフォルトは 79 カラムです。

-Xlistwar[nnn] - 検証レポートから nnn 番の警告を抑制します。

出力レポートから特定の警告メッセージを抑制するときに -Xlistwar を使用します。nnn が指定されていない場合は、すべての警告メッセージが出力から抑制されます。たとえば、-Xlistwar338 とすると、338 番の警告メッセージが抑制されます。すべてではない複数の警告を対象にするときは、このオプションを繰り返して指定します。

-XlistX - クロスリファレンステーブルとルーチン間のエラーを表示します。

-XlistX は、クロスリファレンステーブルとクロスルーチンエラーリストは生成しますが、ソースリストは生成しません。

サブオプションを使用した例

例 : -Xlistwarnnn を使用して 2 つの警告を前出の例で抑制します。

demo% f77 -Xlistwar338  -Xlistwar348 -XlistE -silent Repeat.f
demo% cat Repeat.lst
FILE  "Repeat.f"
program  repeat
     4             CALL nwfrk ( pn1 )
                                  ^
**** エラー  #418:  引数 "pn1" は real ですが、仮引数は integer です。
                 Repeat.f の 14 行目を参照してください。
     4             CALL nwfrk ( pn1 )
                                  ^
**** エラー  #317:  変数 "pn1" は integer** として21 行目の 
repeat/nwfrk//prnok 中で参照されていますが、real として repeat によっ
て2 行目で設定されています。
subroutine  nwfrk
    17             PRINT *, prnok ( ix ), fork ( )
                                     ^
**** エラー  #418:  引数 "ix" は integer ですが、仮引数は real です。
                 Repeat.f の 20 行目を参照してください。

 
日付:     (水) 2 月 24 10:40:32 1999
ファイル:      2 個(ソース 1 個、ライブラリ 1 個)
行:          26 行(ソース 26 個、ライブラリ副プログラム 2 個)
ルーチン:      5 個(MAIN 1 個、 サブルーチン 3 個、 関数 1 個)
メッセージ:    5 個(エラー 3 個、 警告 2 個)
demo%

例 : メッセージを説明し、型の不一致を探します。

demo% cat ShoGetc.f
    CHARACTER*1 c
    i = getc(c)
    END
demo% f77 -silent ShoGetc.f     プログラムをコンパイルします。
demo% a.out                     プログラムはキーボードからの入力を待ちます...
Z          キーボードから Z を入力します。実行時メッセージが出力されます。
なぜこのメッセージが出力されるのでしょうか。

 
注:IEEE 浮動小数点算術例外フラグ発生。 
    無効演算です。
 『数値計算ガイド』または ieee_flags(3M) を参照してください。

 
demo% f77 -XlistE -silent ShoGetc.fグローバルプログラムチェックで
コンパイルし、リストを表示します。
demo% cat ShoGetc.lst
FILE  "ShoGetc.f"
program  MAIN
     2          i = getc(c)
                ^
**** 警告  #320:  変数 "i" は設定されていますが参照されません。
     2          i = getc(c)
                       ^
**** エラー #412:  関数 "getc" は real として使用されていますが、宣言は
                integer です。
    ここがエラーです。関数は INTEGER として宣言されていなければなりません。
     2          i = getc(c)
                       ^
**** 警告  #320:  変数 "c" は設定されていますが参照されません。

 
demo% cat ShoGetc.f   getc をINTEGER として宣言するようプログラムを
変更して、再実行します。
    CHARACTER*1 c
    INTEGER getc
    i = getc(c)
    END
demo% f77 -silent ShoGetc.f
demo% a.out
Z                     キーボードから "Z" を入力します。
demo%                 エラーメッセージは出力されません。

特別なコンパイラオプション

デバッグに便利なコンパイルオプションもあります。これらのオプションによって、添字の検査、未宣言変数の印付け、コンパイルとリンク処理の経過の表示、ソフトウェアのバージョンの表示などを行います。

Solaris リンカーには、新しいリンカーデバッグ支援オプションがあります。ld(1) のマニュアルページを参照するか、シェルプロンプトでコマンド ld -Dhelp を実行してオンラインマニュアルを表示してください。

添字の境界 (-C)

-C オプションは、境界を超えている配列の添字を検査します。

-C を付けてコンパイルする場合は、コンパイラは、実行時に境界を超えている各配列の添字への参照を検査します。このオプションは、セグメンテーションフォルトの原因を見つけるときに役立ちます。

例 : 範囲外の索引

demo% cat indrange.f
    REAL a(10,10)
    k = 11
    a(k,2) = 1.0
    END
demo% f77 -C -silent indrange.f
demo% a.out
 ファイル indrange.f、3 行目、手続き MAIN で添字が範囲を越えています。
 配列 a の添字番号 1 の値は 11 です。
 異常終了
demo%

未宣言の変数型 (-u)

-u オプションは、未宣言の変数を検査します。

-u オプションは、最初、すべての変数を未宣言として扱います。したがって、型宣言文や IMPLICIT 文で明示的に宣言されていない変数はすべてエラーとなります。-u オプションは、名前の入力を間違えた変数の発見に役立ちます。-u を設定すると、すべての変数は、明示的に宣言されるまで未宣言として扱われます。未宣言変数を使用している箇所については、エラーメッセージが表示されます。

バージョンのチェック (-V)

-V オプションは、コンパイラのさまざまなフェーズの名前とバージョン ID を表示できます。このオプションは、不明確なエラーメッセージの原因を追跡したり、コンパイラの失敗をレポートするのに役立ちます。また、インストールされたコンパイラパッチのレベルを検証するためにも使用できます。

dbx と Sun WorkShop を使用した対話型デバッグ

Sun WorkShop は、Fortran、C、C++ で書かれたアプリケーションを構築、ブラウズ、デバッグするための密接に統合された環境を提供します。

Sun WorkShop デバッグ機能は、dbx へのウィンドウベースのインタフェースです。dbx 自身は、対話型、行指向、ソースレベルの、シンボリックデバッガです。どちらを使用しても、プログラムがどこでクラッシュしたかを調べたり、実行コード中の変数や式の値を表示または追跡したり、ブレークポイントを設定したりできます。

Sun WorkShop は、洗練されたグラフィカルな環境を、編集、構築、ソースコードバージョン制御用のツールが統合されたデバッグプロセスに追加します。これには、大きくて複雑なデータセットを表示して検査したり、結果のシミュレーションを行ったり、計算を対話的に制御したりするためのデータ視覚化機能が含まれます。

詳細は、『dbx コマンドによるデバッグ』、および dbx(1) のマニュアルページを参照してください。

dbx プログラムは、イベント管理、プロセス制御、データ検査を提供します。プログラムの実行中になにが起こっているかを表示でき、次の作業を行うことができます。

最適化されたプログラムをデバッグするには、dbx fix コマンドを使用して、デバッグしたいルーチンをコンパイルし直します。

1. 適切な -On 最適化レベルでプログラムをコンパイルします。

2. dbx の制御下で実行します。

3. fix -g any.f を使用します。デバッグしたいルーチンには最適化を行いません。

4. コンパイルしたルーチンで continue を使用します。

コマンド行に -g オプションがある場合、一部の最適化機能が制限されます。詳細は『dbx コマンドによるデバッグ』を参照してください。

f77: コンパイラリスト診断を表示する

error ユーティリティプログラムは、コンパイラ診断をソースコードとマージして表示するのに使用します。error はコンパイラ診断をソースファイルの関連する行に挿入します。診断には、標準のコンパイラエラーと警告メッセージが含まれますが、-Xlist のエラーと警告メッセージは含まれません。


注 - エラーユーティリティはユーザーのソースファイルを書き換えるので、ソースファイルが読み取り専用である場合や、読み取り専用のディレクトリにある場合は動作しません。

error(1) は、Solaris オペレーティング環境の、「開発者」インストールの一部として含まれます。また、SUNWbtool パッケージからもインストールできます。

コンパイラ診断を表示する機能は Sun WorkShop にもあります。『Sun WorkShop の概要』を参照してください。


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