トムとマイケル

トム「やあ、マイケルどうしたんだ。やつれた顔して」
マイケル「やあ、トム…どうしたもこうしたもないよ。全くバグがとれないのさ」
トム「ふーん?どこでどんなふうになっているんだい?」
マイケル「それがわからないから困っているのさ…!」
トム「ん?」
マイケル「このソフトなんだがね、起動中にどこかで無限ループしているようなんだよ。だけどどこかわからなくって」
トム「gdbの中で走らせて、killしてやったら?」
マイケル「そうするとほら」

% gdb --args ./src/hengband -- -n1
GNU gdb (Gentoo 7.2 p1) 7.2
Copyright (C) 2010 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-pc-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.gentoo.org/>...
Reading symbols from /home/naota/src/hengband-1-7-1/src/hengband...done.
(gdb) r
Starting program: /home/naota/src/hengband-1-7-1/src/hengband -- -n1
missing font(s): 
        GB2312.1980-0
        KSC5601.1987-0

Program received signal SIGQUIT, Quit.
0x00007ffff758cf68 in poll () from /lib64/libc.so.6
(gdb) bt
#0  0x00007ffff758cf68 in poll () from /lib64/libc.so.6
#1  0x00007ffff70a7b5a in ?? () from /usr/lib64/libxcb.so.1
#2  0x00007ffff70a9208 in xcb_wait_for_event () from /usr/lib64/libxcb.so.1
#3  0x00007ffff788f308 in _XReadEvents () from /usr/lib64/libX11.so.6
#4  0x00007ffff787d818 in XNextEvent () from /usr/lib64/libX11.so.6
#5  0x0000000000550531 in CheckEvent (wait=1 '\001') at main-x11.c:2523
#6  0x0000000000407de6 in Term_xtra (ch=0x7fffffffd56d "", wait=1 '\001', take=1 '\001') at z-term.c:429
#7  Term_inkey (ch=0x7fffffffd56d "", wait=1 '\001', take=1 '\001') at z-term.c:2477
#8  0x00000000004098e2 in inkey_aux () at util.c:1743
#9  inkey () at util.c:2133
#10 0x0000000000409de2 in msg_flush (x=<value optimized out>) at util.c:2673
#11 0x000000000040a916 in msg_print (msg=0x0) at util.c:2745
#12 0x0000000000476e59 in load_player () at save.c:1758
#13 0x00000000004f85bd in play_game (new_game=0 '\000') at dungeon.c:6593
#14 0x0000000000553a94 in main (argc=2, argv=0x7fffffffdf70) at main.c:788
(gdb) 

マイケル「Xのコマンドループがひっかかってしまうんだよ。」
トム「ふーむ、それは大変だ…」
マイケル「だろ?」

トム「………そうだマイケル! Linuxカーネルのソースはあるかい?」
マイケル「もちろんあるよ!Gentooだもの!……でも、それがなにか?」
トム「cd /usr/src/linux/tools/perf して make するんだ」
マイケル「…お、newtとかがいるのか emerge して…と。ほい、できたよ?」
トム「じゃあ、/usr/src/linuxに戻って sudo ./tools/perf/perf topだ」
マイケル「ほうほう、なかなかカラフルだね」

トム「よし、じゃあそこでさっきのプログラムを動かしてごらん。gdbはなくていい。」
マイケル「ん? ん、わかった………やっぱり固まるねえ」
トム「よしよし。perf の画面に戻ってごらん」
マイケル「お…おおお!これはっ!一番上に関数名がばっちり表示されてるじゃないか!」

トム「ほら、これでどこが原因かわかったね。あとはこの関数を見ていけばいいってことさ。」
マイケル「ありがとう!トム!」
トム「なあに、いいってことよ。」