デバッガにおける変数の表示

変数を参照するには、大文字または小文字のいずれかを使用します。次に例を示します。

(idb) print J

(idb) print j

コマンド名は、大文字で入力することができます。

(idb) print J

-names as_is コマンドライン・オプションを使用してプログラムをコンパイルし、大文字・小文字を区別した名前を検証する必要がある場合、$lang 環境変数を大文字・小文字を区別する言語名に設定することで、idb が大文字・小文字の区別を制御することができます。

モジュール変数

モジュール内で定義された変数を参照するには、一重引用符 (‘)、モジュール名、もう 1 つの一重引用符 (‘) を変数名の前に追加してください。例えば、モジュール modfile (MODULE MODFILE 文) で定義された変数 J は、次のコマンドを入力してその値を表示することができます。

(idb)    list 5,9

     5     USE MODFILE

     6      INTEGER*4 J

     7      CHARACTER*1 CHR

     8      J = 2**8

(idb)    print ‘MODFILE‘J

256

共通ブロック変数

print または whatis などのデバッガコマンドを使用することで、Fortran 共通ブロック内の変数の値を表示することができます。

共通ブロック全体を表示するには、共通ブロック名を使用します。

共通ブロックの特定の変数を表示するには、変数名を使用します。次に例を示します。

(idb)     list 1,11

   1       PROGRAM EXAMPLE

   2

   3       INTEGER*4 INT4

   4       CHARACTER*1 CHR

   5       COMMON /COM_STRA/ INT4, CHR

   6

   7       CHR = 'L'

   8

   9       END

(idb)     print COM_STRA

COMMON

        INT4 = 0

        CHR = "L"

(idb)

(idb)     print CHR

"L"

共通ブロック内のデータ項目の名前が、共通ブロックの名前と同じ場合は、データ項目がアクセスされます。

派生型変数

Fortran 95/90 の派生型 (TYPE 文) の変数は、print または whatis などの idb コマンドでは、Fortran 95/90 構文形式を使用して表します。

派生型構造体では、派生型変数名、パーセント記号 (%)、およびメンバ名を使用します。次に例を示します。

(idb)     list 3,11

    3  TYPE X

    4      INTEGER A(5)

    5    END TYPE X

    6  

    7   TYPE (X) Z

    8

    9   Z%A = 1

   10

   11   PRINT *,Z%A

(idb)     print Z%A

(1) 1

(2) 1

(3) 1

(4) 1

(5) 1

(idb)

オブジェクト全体を表示するには、print コマンドでオブジェクト名を使用します。次に例を示します。

(idb)  print Z

レコード変数

レコード構造体に含まれたフィールドの値を表示するには、変数名をレコード名、区切り文字 (ピリオド (.) またはパーセント記号 (%))、そしてフィールド名の順に入力します。

レコード構造体に含まれたすべてのフィールドを表示するには、上記の例で (REC.CHR または REC%CHR ではなく) REC などのレコード構造体の名前を入力します。

ポインタ変数

インテル® Fortran は 2 種類のポインタをサポートします。

Fortran 95/90 ポインタ

Fortran 95/90 ポインタは、print コマンドで対応するターゲット・データを表示します。

コールアウトの右に示されている番号は、後述のプログラム解説の番号です。

ifort -g point.f90

idb ./a.out

Linux Application Debugger for xx-bit applications, Version x.x, Build xxxx

object file name: ./a.out

Reading symbolic information ...done

(idb) stop in ptr

[#1: stop in ptr ]

(idb) list 1:13

      1       program ptr

      2

      3       integer, target :: x(3)

      4       integer, pointer :: xp(:)

      5

      6       x = (/ 1, 2, 3/)

      7       xp => x

      8

      9       print *, "x = ", x

     10       print *, "xp = ", xp

     11

     12       end

(idb) run

[1] stopped at [ptr:6 0x120001838]

      6        x = (/ 1, 2, 3/)

(idb) whatis x

int x(1:3)

(idb) whatis xp                                    (1)

int xp(:)

(idb) s

stopped at [ptr:7 0x120001880]

      7       xp => x

(idb) s

stopped at [ptr:9 0x120001954]

      9       print *, "x = ", x                    

(idb) s

x =            1           2           3

stopped at [ptr:10 0x1200019c8]

(idb) s

 xp =            1           2           3

stopped at [point:12 0x120001ad8]

     12       end

(idb) S  

 xp =            1           2           3

(idb) whatis xp                                     (2)

int xp(1:3)

(idb) print xp

(1) 1

(2) 2

(3) 3

(idb) quit

%

  1. 最初の whatis xp コマンドでは、xp は変数 x を指すように割り当てられていない汎用ポインタです。

  2. xp は、変数 x を指すように割り当てられているため、2 回目の whatis xp コマンドで、xp は変数 x と同じサイズ、形状、および値を取得します。

整数ポインタ

Fortran 95/90 ポインタと同様に、整数ポインタ (Cray* 形式ポインタとも呼ばれます) は、print コマンドを使用して、対応するソース形式でターゲット・データを表示します。

(idb) stop at 14

[#1: stop at "dfpoint.f90":14 ]

(idb) run

[1] stopped at [dfpoint:14 0x1200017e4]

(idb) list 1,14

      1       program dfpoint

      2

      3       real i(5)

      4       pointer (p,i)

      5

      6       n = 5

      7

      8       p = malloc(sizeof(i(1))*n)

      9

     10       do j = 1,5

     11          i(j) = 10*j

     12       end do

     13

>    14       end

(idb) whatis p

float (1:5) pointer p

(idb) print p

0x140003060 = (1) 10

(2) 20

(3) 30

(4) 40

(5) 50

(idb) quit

%

配列変数

配列変数では、Fortran 95/90 のソース文と同様に、括弧の間に添字を追加します。次に例を示します。

(idb) assign arrayc(1)=1

 配列のすべての要素は、その名前を使用して出力することができます。次に例を示します。

(idb) print arrayc

(1) 1

(2) 0

(3) 0

(idb)

大きい配列のすべての要素を表示することは避けてください。その代わりに、特定の配列要素や配列セクションを表示してください。次に、配列要素 arrayc(2) を出力する例を示します。

(idb) print arrayc(2)

(2) 0

配列セクション

配列セクションは配列の一部であり、セクション自体も配列です。配列セクションは、開始要素、終了要素、およびストライド要素の 3 つの部分から構成されるトリプレット表記の添字を使用することができます。

次の配列宣言について考えてみます。

INTEGER, DIMENSION(0:99)    :: arr

INTEGER, DIMENSION(0:4,0:4)  :: FiveByFive

 例えば FiveByFive(4,4) = 44、arr(43) = 43 のように、各配列の各位置にインデックスの値が入るように初期化されているとします。次に、デバッガで許可された配列式の例を示します。

(idb) print arr(2)

2

(idb) print arr(0:9:2)

(0) = 0

(2) = 2

(4) = 4

(6) = 6

(8) = 8

(idb) print FiveByFive(:,3)

(0,3) = 3

(1,3) = 13

(2,3) = 23

(3,3) = 33

(4,3) = 43

(idb)

配列セクションに対して許可された操作は、whatis と print のみに限られます。

配列への代入

配列要素への代入は、idb でサポートされています。

配列全体または配列セレクションへの値の代入に関する情報は、『Intel®Debugger (IDB) Manual』(英語) の Fortran の章を参照してください。

複素変数

idb は、式で COMPLEX、COMPLEX*8、COMPLEX*16、COMPLEX*32 変数および定数をサポートします。

次の Fortran プログラムについて考えてみます。

PROGRAM complextest

      COMPLEX*8 C8 /(2.0,8.0)/

      COMPLEX*16 C16 /(1.23,-4.56)/

      REAL*4     R4 /2.0/

      REAL*8     R8 /2.0/

      REAL*16    R16 /2.0/

 

      TYPE *, "C8=", C8

      TYPE *, "C16=", C16

    END PROGRAM

idb は、基本算術演算子の他に、COMPLEX 変数および定数の表示と代入をサポートします。次に例を示します。

Welcome to the idb Debugger Version x.x-xx

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

object file name: complex

Reading symbolic information ...done

(idb) stop in complextest

[#1: stop in complextest ]

(idb) run

[1] stopped at [complextest:15 0x1200017b4]

     15       TYPE *, "C8=", C8

(idb) whatis c8

complex c8

(idb) whatis c16

double complex c16

(idb) print c8

(2, 8)

(idb) print c16

(1.23, -4.56)

(idb) assign c16=(-2.3E+10,4.5e-2)

(idb) print c16

(-23000000512, 0.04500000178813934)

(idb)  

データ型

次の表は、インテル Fortran データ型と対応する組込みデバッガ名を示します。

Fortran 95/90 データ型の宣言

対応するデバッガ名

CHARACTER

character

INTEGER, INTEGER(KIND=n)

integer, integer*n

LOGICAL, LOGICAL (KIND=n)

logical, logical*n

REAL, REAL(KIND=4)

real

DOUBLE PRECISION, REAL(KIND=8)

real*8

REAL(KIND=16)

real*16

COMPLEX, COMPLEX(KIND=4)

complex

DOUBLE COMPLEX, COMPLEX(KIND=8)

double complex

COMPLEX(KIND=16), COMPLEX*32

long double complex