我在 Emacs 24 中使用 GDB 并gdb-many-windows
设置为t
,通常在它自己的框架中。我喜欢有一个单独的编辑框。它看起来像这样(为我粗略的 ASCII 图道歉):
+-------------+-------------+
| gdb | locals |
+-------------+-------------+
| source | I/O |
| | |
+-------------+-------------+
| stack | breakpoints |
+-------------+-------------+
这工作得很好,除了一个大问题。每当 gdb 需要显示不同的源缓冲区时,例如,在 up/down/step 之后,它并不总是在“源”窗口中显示它。例如,如果我在不同框架的窗口中打开了相同的缓冲区,它将提升该框架,同时将键盘焦点保持在 gdb 框架中。当框架相互覆盖时,这在单显示器设置中真的很烦人。
我希望 gdb 始终使用 gdb-many-windows 设置中的源窗口来显示源,无论是否在其他地方显示相同的源缓冲区。我怎样才能做到这一点?
编辑:更详细的复制说明。我将 Emacs 24.2.1 与 GDB 7.5-ubuntu 一起使用。我在 Ubuntu 10.04 和带有 Cinnamon 的 Linux Mint Nadia 上看到了这个问题。
- 评估这个表达式:
(setq gdb-many-windows t)
- 用至少两个文件编译一个 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
。在该框架中,使用M-x gdb
. 如上所示,该框架中应该有六个窗口。将 gdb 框架放在源框架的顶部。 - 设置断点
main
并逐步调用foo
和bar
。当bar
被调用时,主框架将被提升到 gdb 框架上,因为 bar.c 已经在那里可见,但键盘焦点将保留在 gdb 框架中。
我认为问题函数gdb-display-source-buffer
在 gud.el.gz 中。我打算尝试用 覆盖它defadvice
,但我不太熟悉建议。如果我弄明白了,我会在这里发布答案。