我通常在Emacs 24中使用GDB,并将gdb-many-windows
设置为t
,通常在其自己的框架中。我喜欢有一个单独的编辑框架。它看起来像这样(对于我粗略的ASCII图表,表示歉意):
+-------------+-------------+
| gdb | locals |
+-------------+-------------+
| source | I/O |
| | |
+-------------+-------------+
| stack | breakpoints |
+-------------+-------------+
这个方法很好,但存在一个大问题。每当 gdb 需要显示不同的源缓冲区时(例如,up/down/step 后),它并不总是在“source”窗口中显示。例如,如果我在另一个框架的窗口中打开了相同的缓冲区,则它将升起该框架,同时保持键盘焦点在 gdb 框架中。在单监视器设置中,当帧互相覆盖时,这真的很烦人。
我想让 gdb 在 gdb-many-windows 设置中始终使用源窗口来显示源代码,无论其他地方是否显示了相同的源缓冲区。怎么做?
编辑:更详细的说明以重现此问题。我正在使用 Emacs 24.2.1 和 GDB 7.5-ubuntu。我在 Ubuntu 10.04 和 Linux Mint Nadia with Cinnamon 上看到了这个问题。
请执行以下步骤:
- 评估此表达式:
(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。如上图所示,该框架应具有6个窗口。将gdb框架放在源框架之上。 - 在
main
函数中设置断点,并跟踪调用foo
和bar
。当调用bar
时,因为bar.c已经在主框架中可见,所以主框架将覆盖gdb框架,但键盘焦点仍停留在gdb框架中。
我认为问题函数是gud.el.gz中的gdb-display-source-buffer
。我计划尝试使用defadvice
覆盖它,但我并不熟悉这个技术。如果我成功了,我会在这里发布答案。
emacs -q
命令来检测您的配置是否存在潜在问题。另外,请尝试提供一个最小化的示例,即小型源文件和逐步复现该问题的指令。 - Tobias