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

前回はGDBデバッグで文字列を見やすくするため、デバッグ対象であるFORTRANプログラムを修正しました。ナンセンスなことですが、早く覚えるためできるだけたくさんFORTRANのプログラミングをしていこうと思ってます。たまたま思いつきでFORTRANプログラミングできましたが、いつもうまくいくとは限りません。あまりFORTRANに根気を使うと疲れてしまって、勉強も続かないので、FORTRAN修得までの長い道のりのモチベーション維持のため、たまには使い慣れた言語を使ってみます。

さてFORTRANのプログラムを改造せずに、文字列をきれいに表示する方法として、今回はGDBでPythonスクリプトを使います。まずはPythonをGDBで使えるようにインストール。

root@deb9:~# apt-get install gdb-python2

これで、GDBでPythonスクリプト使えます。さっそく試してみましょう。

takk@deb9:~$ gdb a.out

~

(gdb) pi print 'HELLO'
HELLO
(gdb)

素晴らしい。これもうGDBも思いのままです。
GDBスクリプトの代わりにPythonスクリプトでGDB自動化してみましょう。こんなスクリプトを使います。

takk@deb9:~$ cat -n test1.py
     1  gdb.execute('set args -b1,2,3,4,5')
     2  gdb.execute('break B_OPT')
     3  gdb.execute('run')
takk@deb9:~$

executeの中の文字列は、GDBスクリプトそのままです。
FORTRANプログラムを-g付きでビルドして、GDB起動します。

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

さきほどのPythonスクリプトを実行しましょう。

(gdb) source test1.py
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)
(gdb)

さて、問題の残りが空白で埋められる文字列変数ですが、Pythonスクリプトを使って、きれいにトリムしたいと思います。

(gdb) p b_opt_string
$1 = '1,2,3,4,5', ' ' <repeats 89 times>, '\000\000'
(gdb)

さきほどのスクリプトに4~6行目を追加しました。FORTRAN77ではすぐには書けない文字列処理も、Pythonではお茶の子さいさい。

takk@deb9:~$ cat -n test2.py
     1  gdb.execute('set args -b1,2,3,4,5')
     2  gdb.execute('break B_OPT')
     3  gdb.execute('run')
     4  s=gdb.execute('p B_OPT_STRING',to_string=True)
     5  ss=(s.split("'"))[1]
     6  print ss
takk@deb9:~$

再度GDBを起動します。今度は、gdb起動時に、-xオプションでPythonスクリプトも一緒に実行してしまいましょう。

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

~

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)
1,2,3,4,5
(gdb)

シングルクォートをPythonでスプリットしてリストの2番目を表示しました。
-bオプションで指定した文字列が、そのままさくっと表示されましたね。

Leave a Reply

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

CAPTCHA