映画『メメント』(2000)(監督クリストファー・ノーラン 主演ガイ・ピアース)
生涯見た中のベストテンに入る面白さでした。時間軸が逆からスタートするってところが、エンジニア心をくすぐります。少しずつわかってくる事実が、まるでデバッグしているようです。つまりデバッグも映画のように面白いってことではありますが。
メメントのようにGDBでリバース実行してみます。
今回もソースが見渡せるようにCGDB使います。ちなみに設定はこれ。
takk@deb83:~/sysvbanner-1.0.15$ cat -n ~/.cgdb/cgdbrc 1 :set arrowstyle='long' 2 :set winminheight=4 3 :set winsplit=top_big takk@deb83:~/sysvbanner-1.0.15$
ではCGDBを起動します。
takk@deb83:~/sysvbanner-1.0.15$ cgdb banner (省略) (gdb) b main Breakpoint 1 at 0x8048440: file banner.c, line 132. (gdb) run HELLO Starting program: /home/takk/sysvbanner-1.0.15/banner HELLO Breakpoint 1, main (argc=2, argv=0xbffff794) at banner.c:132 (gdb)
mainでブレイクしたら、recordを実行します。要するに記録です。メメントと同じく、記録することで後から見ることができるんです。
(gdb) record
変数を観測しないとつまらないので、display設定しておきましょう。
(gdb) disp {a,b,c,len,ind} 1: {a,b,c,len,ind} = {134514194, 134523828, 47, -1073743696, 134513341} (gdb) disp (char*)line 2: (char*)line = 0xbffff66c "\001" (gdb)
main関数の最後の行である154行目を、ブレイクポイント設定しておきます。
(gdb) b 154 Breakpoint 2 at 0x80485a1: file banner.c, line 154. (gdb)
では、main関数の最後までcontinueで実行しましょう。
displayで表示されている変数を見ると、for文の最大値をオーバーしているところからはじまります。
reverse-next(省略rn)でリバースステップしてみます。
(gdb) rn
for文を抜けた直前に戻りました。
条件ブレイクを設定して、条件を満たすところまで戻ってみましょう。
(gdb) b 140 if a==1 Breakpoint 3 at 0x80484a5: file banner.c, line 140. (gdb)
reverse-continue(省略rc)します。
(gdb) rc
何度も行ったり来たりして、ソースの理解を深めるのに役立ちますね。
コメント