8

Emacs 24 で GDB を にgdb-many-windows設定して使用tします。通常は独自のフレームで使用します。私は別の編集フレームを持っているのが好きです。次のようになります (粗雑な ASCII ダイアグラムで申し訳ありません)。

+-------------+-------------+
| gdb         | locals      |
+-------------+-------------+
| source      | I/O         |
|             |             |
+-------------+-------------+
| stack       | breakpoints |
+-------------+-------------+

これは、1 つの大きな問題を除けば、非常にうまく機能します。gdb が別のソース バッファを表示する必要がある場合 (たとえば、アップ/ダウン/ステップの後)、常に「ソース」ウィンドウに表示されるとは限りません。たとえば、別のフレームのウィンドウで同じバッファーを開いている場合、gdb フレームでキーボード フォーカスを維持しながら、そのフレームが発生します。これは、フレームが互いに重なっている単一モニターのセットアップでは非常に厄介です。

同じソース バッファが別の場所に表示されているかどうかに関係なく、gdb-many-windows セットアップでソース ウィンドウを常に使用してソースを表示するようにします。どうやってやるの?


編集:再現するためのより詳細な手順。GDB 7.5-ubuntu で Emacs 24.2.1 を使用しています。この問題は、Ubuntu 10.04 と Linux Mint Nadia と Cinnamon で見られました。

  • この式を評価します。(setq gdb-many-windows t)
  • 少なくとも 2 つのファイルで C プログラムをコンパイルします。

例えば:

// foo.c
void bar(int);
void foo(int c) {
  if (c > 0)
    bar(c - 1);
}
int main(void) {
  foo(100);
  return 0;
}

// bar.c
void foo(int c);
void bar(int c) {
  if (c > 0)
    foo(c - 2);
}

// compile with gcc -g -O0 foo.c bar.c -o test
  • メインフレームにbar.cを表示させます。で新しいフレームを開きM-x 5 2ます。そのフレームで、gdb を で開始しM-x gdbます。上記のように、そのフレームには 6 つのウィンドウがあるはずです。ソース フレームの上に gdb フレームを配置します。
  • にブレークポイントを設定し、とのmain呼び出しをステップ実行します。が呼び出されると、bar.c が既にそこに表示されているため、メイン フレームが gdb フレームの上に持ち上げられますが、キーボード フォーカスは gdb フレームにとどまります。foobarbar

gdb-display-source-buffer問題の関数はgud.el.gzにあると思います。これを でオーバーライドしようと計画していますdefadviceが、アドバイスに詳しくありません。私がそれを理解したら、私はここに答えを投稿します。

4

3 に答える 3

2

この問題の原因となっている関数は、実際gud-display-lineにはgud.el.gzにあります。この関数は、ソース ウィンドウの現在の行にオーバーレイ矢印を配置し、それが確実に表示されるようにします。ロジックは次のとおりです。

(let* ...
 (window (and buffer
          (or (get-buffer-window buffer)
          (if (eq gud-minor-mode 'gdbmi)
              (or (if (get-buffer-window buffer 'visible)
                  (display-buffer buffer nil 'visible))
              (unless (gdb-display-source-buffer buffer)
                (gdb-display-buffer buffer nil 'visible))))
          (display-buffer buffer))))

以前defadviceは関数全体をオーバーライドしていました。基本的に、ソースをコピーして、ウィンドウの選択ロジックを変更しました。

(defadvice gud-display-line (around do-it-better activate)
  (let* ...
     (window (and buffer
                  (or (if (eq gud-minor-mode 'gdbmi)
                          (unless (gdb-display-source-buffer buffer)
                            (gdb-display-buffer buffer nil 'visible)))
                      (get-buffer-window buffer)
                      (display-buffer buffer))))
  ...)

明らかに、最もエレガントなソリューションではありません。また、フレームの切り替え(アップ/ダウン/フレーム)の際にも役に立たないので、それがわかったらこれを編集します.

于 2013-12-04T22:15:07.893 に答える
-1

私は Emacs 24.5 を実行していますが、これはまだ問題です。現在、主に次の機能を使用して、専用のウィンドウを使用してウィンドウを手動で管理しています。

(defun gdb-restore-windows-gud-io-and-source ()
  "Restore GUD buffer, IO buffer and source buffer next to each other."
  (interactive)
  ;; Select dedicated GUD buffer.
  (switch-to-buffer gud-comint-buffer)
  (delete-other-windows)
  (set-window-dedicated-p (get-buffer-window) t)
  (when (or gud-last-last-frame gdb-show-main)
    (let ((side-win (split-window nil nil t))
          (bottom-win (split-window)))
      ;; Put source to the right.
      (set-window-buffer
       side-win
       (if gud-last-last-frame
           (gud-find-file (car gud-last-last-frame))
         (gud-find-file gdb-main-file)))
      (setq gdb-source-window side-win)
      ;; Show dedicated IO buffer at the bottom.
      (set-window-buffer
       bottom-win
       (gdb-get-buffer-create 'gdb-inferior-io))
      (set-window-dedicated-p bottom-win t))))

これは、左上に GUD ウィンドウ、左下に IO バッファを表示し、ソース バッファを右側に設定します。GUD と IO バッファは専用に設定されています。

于 2015-06-01T11:15:11.660 に答える