emacsかgdbがバージョンアップしたせいで、Emacsでgdbを使ったとき、うまく対応するソースコード行を追従しなくなった。この問題は検索の結果、gdbの--fullnameオプションを指定することが解決すると判る。しかし、これをコマンドファイルで指定するにはどうしたらよいだろうか?
答えは、set annotate 1とコマンドファイルに書けばよい。解決に至る道程は以下の通り。
gdb 6.3のソースコードを落としてきて見てみると、--fullnameオプションは、main.cc中のstatic struct option long_options[]で定義されている。
static struct option long_options[] = {
...
/* This is a synonym for "--annotate=1". --annotate is now preferred,
but keep this here for a long time because people will be running
emacses which use --fullname. */
{"fullname", no_argument, 0, 'f'},
{"f", no_argument, 0, 'f'},
{"annotate", required_argument, 0, OPT_ANNOTATE},
...
このstruct optionは、getoptの構造体。結局--fullnameを指定すると、
case OPT_ANNOTATE:
/* FIXME: what if the syntax is wrong (e.g. not digits)? */
annotation_level = atoi (optarg);
break;
case 'f':
annotation_level = 1;
/* We have probably been invoked from emacs. Disable window interface. */
use_windows = 0;
break;
「--annotateを使え」と言っているけれど、use_windowsもセットしなければならないので、まだ時期尚早か。
GDBのマニュアルのannotationsの項を見ると、この設定は、set annotate
levelで変更できる。
ソースコード行の追従は、gdbがコマンドラインの前後に発生させる特殊文字^z^zを検出することで実現されているようだ。昔はgudがこの--fullnameオプションを自動的に付与していたようなのだが、それをやらなくなってしまったため問題が起きたのだろう。