Sun Studio 12: Fortran プログラミングガイド

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

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

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

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

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

–Xlist はまた、詳細なソースコードのリストと相互参照表も作成します。

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

5.1.1 GPC の概要

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

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

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

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

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


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

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

5.1.2.1 画面への出力

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

例: 端末に表示します。


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

5.1.2.2 デフォルトの出力機能

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

5.1.2.3 ファイル形式

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

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

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


demo% cat Repeat.f
       PROGRAM repeat
         pn1 = 27.005
         CALL subr1 ( pn1 )
         CALL newf ( pn1 )
         PRINT *, pn1
       END

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

       SUBROUTINE newf( ix )
         INTEGER PRNOK
         IF (ix .eq. 0) THEN
                ix = -1
         ENDIF
         PRINT *, prnok ( ix )
       END

       INTEGER FUNCTION prnok ( x )
         prnok = INT ( x ) + .05
       END

       SUBROUTINE unreach_sub()
         CALL sleep(1)
       END

       SUBROUTINE subr2 (x)
         CALL subr1(x+x)
       END

例: -XlistX を使用して、エラー、警告、および相互参照を表示します。


demo% f95 -XlistX Repeat.f
demo% cat Repeat.lst
Repeat.f                    (月) 3 月 18 18:08:27 2002 ページ 1

FILE  "Repeat.f"
program  repeat
     4           CALL newf ( pn1 )
                             ^
**** エラー #418: 実引数 "pn1" は real ですが、仮引数は integer です。
                 "Repeat f" の 14 行目を参照してください。
     5           PRINT *, pn1
                          ^
**** エラー #570: 変数 "pn1" は real として参照されていますが、
                 4 行目では integer として設定されています。
subroutine  newf
    19           PRINT *, prnok  ( ix )
                                   ^
**** エラー #418: 引数 "ix" は integer ですが、仮引数は real です。
                 "Repeat f" の 22 行目を参照してください。
function  prnok
    23           prnok = INT ( x ) + .05
                 ^
**** 警告 #1024: 型 "integer*4" の値への型 "real*4" の
                 疑わしい代入値
subroutine  unreach_sub
    26         SUBROUTINE unreach_sub()
                          ^
**** 警告 #338: サブルーチン "unreach_sub" はプログラムから呼び出されません。
subroutine  subr2
    31           CALL subr1(x+x)
                 ^
**** 警告 #348:"subr1" の再帰的呼び出し。動的呼び出しを参照してください:
                 "Repeat f" の 10 行目
                 "Repeat f" の 3 行目

相互参照 (月) 3 月 18 18:08:27 2002 ページ 2

         相 互 参 照 表

  ソースファイル: Repeat.f


凡例:
D        定義 / 宣言
U        単純な使用
M        変更箇所
A        実引数
C        サブルーチン / 関数呼び出し
I        初期設定: DATA または拡張宣言
E        EQUIVALENCE での出現
N        NAMELIST での出現
L        モジュールを使用します



相互参照 (月) 3 月 18 15:40:57 2002 ページ 3

プ ロ グ ラ ム 形 式

 プログラム
 -------

repeat          <repeat>        D      1:D

相互参照 (月) 3 月 18 03:40:57 午後 2002 ページ 4


 関数とサブルーチン
 -------------------------

INT      intrinsic
                <prnok>         C     23:C

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

prnok    int*4  <newf>         DC     15:D     19:C
                <prnok>        DM     22:D     23:M

sleep           <unreach_sub>            C     27:C

subr1           <repeat>        C      3:C
                <subr1>         D      8:D
                <subr2>         C     31:C

subr2           <subr1>         C     10:C
                <subr2>         D     30:D

unreach_sub     <unreach_sub>            D     26:D

相互参照 (月) 3 月 18 03:40:57 午後 2002 ページ 5


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

ix      int*4  dummy
                <newf>       DUMA     14:D     16:U     17:M     19:A

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

x       real*4 dummy
                <subr1>        DU      8:D      9:U     10:U
                <subr2>        DU     30:D     31:U     31:U
                <prnok>        DA     22:D     23:A

------------------------------------------------------------------
統計情報 (月) 3 月 18 15:40:57 2002 ページ 6


日付: (月) 3 月 18 15:40:57 2002
オプション:   -XlistX
ファイル:      2 (ソース: 1、ライブラリ: 1)
行:            33 (ソース: 33、ライブラリサブプログラム: 1)
ルーチン:      6 (主: 1、サブルーチン: 4、関数: 1)
メッセージ:    6 (エラー: 3、警告: 3)

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

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

以降に、リスト、エラー、相互参照表を生成するオプションを説明します。複数のサブオプションをコマンド行に指定することもできます。

5.1.4.1 サブオプションの構文

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

5.1.4.2 -Xlist とサブオプション

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

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


demo% f95  -Xlistc  -Xlist  any.f

demo% f95 - Xlistc  any.f

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

表 5–1 Xlist の基本的なサブオプション

生成されるレポート 

オプション 

エラー、リスト、相互参照表 

–Xlist

エラーのみ 

–XlistE

エラーとソースリストのみ 

–XlistL

エラーと相互参照表のみ

–XlistX

エラーと呼出しグラフのみ

–Xlistc

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

表 5–2 -Xlist サブオプションの全リスト

オプション 

動作 

–Xlist (サブオプションなし)

エラー、リスト、相互参照表を表示する 

–Xlistc

呼出しグラフとエラーを表示する

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

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

–XlistE

エラーを表示する

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

–Xlisterr[nnn]

検証レポートから nnn 番のエラーを削除する

リストや相互参照表から番号付きのエラーメッセージを抑制するときに使用します。

例: -Xlisterr338 はエラーメッセージ 338 を抑制します。ほかの特定のエラーを抑制する場合は、このオプションを繰り返し使用してください。nnn が指定されていない場合は、すべてのエラーメッセージが抑制されます。

–Xlistf

出力を高速化する 

完全なコンパイルを行わずに、ソースファイルのリストとクロスチェックレポートを生成してソースを検査するには、-Xlistf を使用します。

–Xlisth

クロスチェックのエラーの場合、コンパイルを停止する 

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

–XlistI

include ファイルのリストとクロスチェック

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

リスト - リストが抑制されていない場合は、include ファイルは所定の場所でリストされます。このため、インクルードされるたびに何回でもファイルがリストされることになります。リストされるファイルは、ソースファイル、#include ファイル、INCLUDE ファイルです。

相互参照表— 相互参照表が抑制されていない場合は、相互参照表 の生成中に次のファイルが走査されます。ソースファイル、#include ファイル、INCLUDE ファイルです。

デフォルトでは、include ファイルは表示されません。

–XlistL

リストとエラーを表示する

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

–Xlistln

改ページを設定する 

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

n=0 (-Xlistl0) の場合、このオプションは、改ページをせずにリストと相互参照表を表示します。これは、画面上で表示するときに便利です。

-XlistMP

(SPARC) OpenMP 指令の整合性を検査する

ソースコードファイル内に指定された OpenMP 指令間の非整合性を報告するときに -XlistMP を使用します。詳細は、『OpenMP API ユーザーズガイド』を参照してください。

–Xlisto name

-Xlist レポート出力ファイルの指定

-Xlisto を使用して、生成されるレポート出力ファイルを指定します。oname の間には空白文字が必要です。-Xlisto name を使用した場合、出力先は file.lst ではなく name になります。

画面に直接表示するときは次のオプションを使用します。 -Xlisto /dev/tty

–Xlists

相互参照表から参照されない識別子を削除する 

include ファイルで定義されているが、ソースファイルで参照されていない識別子を、相互参照表から抑制します。

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

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

–Xlistvn

検査の「厳密度」を設定する 

n には 1234 のいずれかを設定します。デフォルトは 2 です (–Xlistv2)。

  • –Xlistv1

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

  • –Xlistv2

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

  • –Xlistv3

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

  • –Xlistv4

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

–Xlistw[nnn]

出力行の幅を設定する 

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

–Xlistwar[nnn]

レポートから nnn 番の警告を削除する

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

–XlistX

相互参照表とエラーだけを表示する 

-XlistX は、相互参照表とクロスルーチンエラーリストは生成しますが、ソースリストは生成しません。

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

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

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

5.2.1 添字の境界 (–C)

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

例: 範囲外の索引


demo% cat range.f
      REAL a(10,10)
      k = 11
      a(k,2) = 1.0
      END
demo% f95 -o range range.f
demo% range

 ******  FORTRAN RUN-TIME SYSTEM  ******
Subscript out of range. Location: line 3 column 9 of 'range.f'
Subscript number 1 has value 11 in array 'A'
異常終了
demo%

5.2.2 未宣言の変数型 (–u)

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

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

5.2.3 コンパイラのバージョンの検査 (–V)

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


demo% f95 -V wh.f
f95: Sun Fortran 95 7.0 DEV 2002/01/30
f90comp: Sun Fortran 95 7.0 DEV 2002/01/30
f90comp: 9 ソース行
f90comp: 0 個のエラー, 0 個の警告, 0 個のほかのメッセージ, 0 個の ANSI
ld: Solaris Link Editors: 5.8-1.272

5.3 dbx によるデバッグ

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

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

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

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

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

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

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

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

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