emacsをgdbで使ってソースコードを追従しなくなった問題

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オプションを自動的に付与していたようなのだが、それをやらなくなってしまったため問題が起きたのだろう。

(2005/09/07)