FORTRAN(デバッグする)

前回のプログラムはバグってますので、デバッグしたいと思います。
gfortranというコンパイラを使ってますが、gがつくぐらいですからGDBも使えるでしょう。試しに-gをつけてビルドしてみます。

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

すんなり通りました。
gdbを起動します。

takk@deb9:~$ gdb a.out
GNU gdb (Debian 7.12-6) 7.12.0.20161007-git
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from a.out...done.
(gdb)

動きましたね。問題はここから。C言語の場合は、break mainとかしてmain関数にブレイク設定してからrunすれば良いですが、FORTRANはどこで止めればよいのでしょう。
とりあえずlコマンドでソースを見てみます。

(gdb) l
1             PROGRAM MAIN
2               CHARACTER*100 STRING
3               CHARACTER*10 SSTRING1(10),SSTRING2(10)
4               INTEGER I,SSIZE1,SSIZE2
5
6               STRING='1-3,5,7-12,13,14'
7               WRITE(*,*) STRING
8
9               CALL SPLIT(STRING,',', SSTRING1,SSIZE1)
10              WRITE(*,1100) SSIZE1
(gdb)

なるほど。行番号が表示されてますね。きっとこの番号を指定すれば、ブレイクポイントを設定できます。

(gdb) b 6
Breakpoint 1 at 0xcd9: file split2.f, line 6.
(gdb)

いけましたね。runします。

(gdb) run
Starting program: /home/takk/a.out

Breakpoint 1, MAIN__ () at split2.f:6
6               STRING='1-3,5,7-12,13,14'
(gdb)

ブレイクポイントで停止しました。
STRING変数を確認します。設定前ですので、ゼロでしょうか。

(gdb) print string
$1 = '\340\344\377\377\377\177\000\000\266\316\376\366\377\177\000\000 ?\367\377\177\000\000\266\316\376\366\377\177\000\000 ?\367\377\177\000\000\000\000\000\001', '\000' <repeats 56 times>
(gdb)

ゼロではなく初期化されていないので元のメモリの値が表示されました。
ステップ実行してみます。

(gdb) next
7               WRITE(*,*) STRING
(gdb)

再度STRING変数を確認します。

(gdb) print string
$2 = '1-3,5,7-12,13,14', ' ' <repeats 84 times>
(gdb)

初期化されて想定通りの文字列が格納されました。
この調子でデバッグしていけば、バグの原因も分かりそうです。

Leave a Reply

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

CAPTCHA