sysvbannerをGDBで追う(リバース)

映画『メメント』(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) 

reverse-001
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で実行しましょう。
reverse-002

displayで表示されている変数を見ると、for文の最大値をオーバーしているところからはじまります。
reverse-next(省略rn)でリバースステップしてみます。

(gdb) rn

reverse-003

for文を抜けた直前に戻りました。

条件ブレイクを設定して、条件を満たすところまで戻ってみましょう。

(gdb) b 140 if a==1
Breakpoint 3 at 0x80484a5: file banner.c, line 140.
(gdb) 

reverse-continue(省略rc)します。

(gdb) rc

reverse-004

何度も行ったり来たりして、ソースの理解を深めるのに役立ちますね。

コメント

タイトルとURLをコピーしました