FORTRAN(自作splitのデバッグその4)

前回はprintfテストをしたので、今回はGDBのスクリプトでテストします。
まず、対象プログラムからテスト用コードを取っ払います。

takk@deb9:~$ cat -n split4.f
     1        PROGRAM MAIN
     2          CHARACTER*100 ARGS
     3          CALL GETARG(1,ARGS)
     4          IF(ARGS(1:2).EQ.'-b') THEN
     5            CALL B_OPT(ARGS(3:))
     6          END IF
     7          STOP
     8        END
     9
    10        SUBROUTINE B_OPT(B_OPT_STRING)
    11          CHARACTER*100 B_OPT_STRING
    12          CHARACTER*100 SSTRING1(10),SSTRING2(10)
    13          INTEGER I,SSIZE1,SSIZE2
    14
    15          CALL SPLIT(B_OPT_STRING,',', SSTRING1,SSIZE1)
    16          DO 10100 I=1,SSIZE1
    17            CALL SPLIT(SSTRING1(I),'-', SSTRING2,SSIZE2)
    18  10100   CONTINUE
    19          STOP
    20        END
    21
    22        SUBROUTINE SPLIT(SRC,SEP,DEST,SPLIT_SIZE)
    23          CHARACTER*100 SRC
    24          CHARACTER*1 SEP
    25          CHARACTER*100 DEST(10)
    26          INTEGER IND,S1,S2,RSLT,SPLIT_SIZE
    27          IND = 0
    28          S2=-1
    29          I = 1
    30  20100   RSLT = INDEX(SRC(IND+1:),SEP)
    31          IF(RSLT.NE.0) THEN
    32            S1 = IND+1
    33            IND = IND + RSLT
    34            S2 = IND-1
    35            DEST(I) = SRC(S1:S2)
    36            I = I + 1
    37            GOTO 20100
    38          END IF
    39          DEST(I) = SRC(S2+2:)
    40          SPLIT_SIZE = I
    41          RETURN
    42        END
takk@deb9:~$

次に-gオプションをつけてビルド。

takk@deb9:~$ gfortran -g split4.f
takk@deb9:~$

次はGDBのスクリプトを作成します。GDBで使うコマンドを列挙したテキストファイルを作ればよいです。

takk@deb9:~$ cat test1
break B_OPT
set args -b1,2
run

next
echo "B_OPT_STRING:"
print B_OPT_STRING
echo "SSIZE1:"
print SSIZE1



set args -b1,2,3,4,5
run

next
echo "B_OPT_STRING:"
print B_OPT_STRING
echo "SSIZE1:"
print SSIZE1


set args -b1,2,3,4,5,7,8,9,10
run

next
echo "B_OPT_STRING:"
print B_OPT_STRING
echo "SSIZE1:"
print SSIZE1

takk@deb9:~$

GDBのスクリプト名はtest1としました。
実行は、-xオプションをつけてファイル名を指定します。

takk@deb9:~$ gdb a.out -x test1

実行すると、結果が表示されます。

Reading symbols from a.out...done.
Breakpoint 1 at 0x979: file split4.f, line 15.

Breakpoint 1, b_opt (b_opt_string=..., _b_opt_string=98) at split4.f:15
15              CALL SPLIT(B_OPT_STRING,',', SSTRING1,SSIZE1)
16              DO 10100 I=1,SSIZE1
"B_OPT_STRING:"$1 = '1,2', ' ' <repeats 95 times>, '\000\000'
"SSIZE1:"$2 = 2

Breakpoint 1, b_opt (b_opt_string=..., _b_opt_string=98) at split4.f:15
---Type <return> to continue, or q <return> to quit---

Enterキー待ちになるので、確認したら、Enterを押します。

---Type <return> to continue, or q <return> to quit---
15              CALL SPLIT(B_OPT_STRING,',', SSTRING1,SSIZE1)
16              DO 10100 I=1,SSIZE1
"B_OPT_STRING:"$3 = '1,2,3,4,5', ' ' <repeats 89 times>, '\000\000'
"SSIZE1:"$4 = 5

Breakpoint 1, b_opt (b_opt_string=..., _b_opt_string=98) at split4.f:15
15              CALL SPLIT(B_OPT_STRING,',', SSTRING1,SSIZE1)
16              DO 10100 I=1,SSIZE1
"B_OPT_STRING:"$5 = '1,2,3,4,5,7,8,9,10', ' ' <repeats 80 times>, '\000\000'
"SSIZE1:"$6 = 9
(gdb)

結果の続きが表示されます。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA