我是Vim用户,对Emacs不太了解。我对Emacs感兴趣,因为我发现在Emacs中进行调试会更加愉快。例如,它提供语法高亮显示,并且我可以使用鼠标设置断点。
除非printf
遇到任何情况,否则一切正常。
用于说明的简单代码:
1 #include2 3 int main() 4 { 5 int a = 1; 6 printf("%d\n", a); 7 int b = 2; 8 return 0; 9 }
emacs main.c
左下角单击
Mx gdb [return] [return]
(gdb)b 6
(gdb)r
到目前为止,源代码显示在上半部分,而gdb提示显示在下半部分。这正是我想要的。
(gdb)n
现在源代码消失了,上半部分用来显示stdout。这真的很不方便。我希望标准输出显示在gdb缓冲区中,而源则保留在较高的缓冲区中,就像gdb -tui
模式一样。
与其每次都手动设置拆分,不如告诉GDB您想要哪些窗口。
例如:
;; Show main source buffer when using GDB
(setq gdb-show-main t)
现在,您可以简单地M-x gdb
用来启动GDB,它应该使您的源代码缓冲区显示在拆分窗口中。
顺便说一句,Emacs的GDB界面支持您可能要启用的许多其他窗口:
如果
gdb-many-windows
为nil
,则M-x gdb
显示以下框架布局:+--------------------------------+--------------------------------+ | GUD interaction buffer | Locals/Registers buffer | |--------------------------------+--------------------------------+ | Primary Source buffer | I/O buffer for debugged pgm | |--------------------------------+--------------------------------+ | Stack buffer | Breakpoints/Threads buffer | +--------------------------------+--------------------------------+
如果您更改了窗口布局,则可以通过键入恢复“许多窗口”布局
M-x gdb-restore-windows
。要在许多窗口布局和仅带有GUD交互缓冲区和源文件的简单布局之间切换,请键入M-x gdb-many-windows
。您还可以指定要显示的其他GDB相关缓冲区,它们可以在同一帧中显示,也可以在另一帧中显示。通过输入
M-x gdb-display-BUFFERTYPE-buffer
或选择所需的缓冲区M-x gdb-frame-BUFFERTYPE-buffer
,其中BUFFERTYPE是相关的缓冲区类型,例如breakpoints
。您可以使用菜单栏的GDB-Windows
和GDB-Frames
子菜单来执行相同的操作GUD
。完成调试后,请使用杀死GUD交互缓冲区
C-x k
,这也将杀死与该会话关联的所有缓冲区。但是,如果在Emacs中编辑并重新编译源代码后希望继续调试,则无需执行此操作。当您重新开始执行时,GDB会自动找到新的可执行文件。保留GUD交互缓冲区的优点是可以保留Shell历史记录以及GDB的断点。您确实需要检查最近编辑的源文件中的断点是否仍在正确的位置。