Emacs支持多窗口的GDB调试,要打开GDB的多窗口模式只需要设置Emacs全局变量gdb-many-windows 为true。
但默认的多窗口感觉并不够用,没有汇编窗口,在学习一些语言底层实现的时候有时还需要看看汇编和寄存器内容。
研究Emacs的GBD ui脚本发现Emacs的GDB多窗口布局不是定义在配置文件,而是固化在程序中实现的。
这里写了个函数改造了一下窗口布局,下面代码在Linux下应该放入.emacs文件,如果window下则放入_emacs文件。
该函数注册成一个切面函数,会在Emacs构建GDB的多窗口结束时被调用,额外再创建出几个窗口,用来显示汇编、内存和寄存器。
;;启动gdb-many-windows时加载的钩子函数,改变many-windows的默认布局,这个钩子函数不能勾在gdb-setup-windows,因为此时assamble-buffer还没完成初始化,不能set到window
(defadvice gdb-frame-handler-1 (after activate)
(if gdb-use-separate-io-buffer
(advice_separate_io)
(advice_no_separate_io)))
;;生成没有单独IO窗口的gdb布局
(defun advice_no_separate_io()
;;默认的生成gdb-assembler-buffer的函数本身也会设计调用gdb-frame-handler-1,加入此条件发生避免无限递归调用
(if (not (gdb-get-buffer 'gdb-assembler-buffer))
(progn
(shrink-window-horizontally ( / (window-width) 3))
(other-window 1)
(split-window-horizontally)
(other-window 1)
(gdb-set-window-buffer (gdb-stack-buffer-name))
(other-window 1)
(split-window-horizontally)
(other-window 1)
(gdb-set-window-buffer (gdb-get-buffer-create 'gdb-assembler-buffer))
(split-window-horizontally (/ ( * (window-width) 2) 3))
(other-window 1)
(gdb-set-window-buffer (gdb-get-buffer-create 'gdb-registers-buffer))
(other-window 1)
(toggle-current-window-dedication)
(gdb-set-window-buffer (gdb-get-buffer-create 'gdb-memory-buffer))
(toggle-current-window-dedication)
(other-window 2)
)))
;;生成有单独IO窗口的gdb布局
(defun advice_separate_io()
;;默认的生成gdb-assembler-buffer的函数本身也会设计调用gdb-frame-handler-1,加入此条件发生避免无限递归调用
(if (not (gdb-get-buffer 'gdb-assembler-buffer))
(progn
(split-window-horizontally)
(enlarge-window-horizontally ( / (window-width) 3))
(other-window 1)
;;此处不能使用(gdb-set-window-buffer (gdb-get-buffer-create 'gdb-inferior-io))代替,
;;因为在打开gdb-use-separate-io-buffer的状态时,它还会额外调用一些函数将gdb的input,output定位到该buffer
(gdb-set-window-buffer (gdb-inferior-io-name))
(other-window 1)
(split-window-horizontally)
(other-window 1)
(gdb-set-window-buffer (gdb-stack-buffer-name))
(other-window 1)
(other-window 1)
(toggle-current-window-dedication)
(gdb-set-window-buffer (gdb-get-buffer-create 'gdb-assembler-buffer))
(toggle-current-window-dedication)
(split-window-horizontally (/ ( * (window-width) 2) 3))
(other-window 1)
(gdb-set-window-buffer (gdb-get-buffer-create 'gdb-registers-buffer))
(other-window 1)
(toggle-current-window-dedication)
(gdb-set-window-buffer (gdb-get-buffer-create 'gdb-memory-buffer))
(toggle-current-window-dedication)
(other-window 2)
)))
语句defadvice gdb-frame-handler-1 (after activate) 这里定义了一个切面函数,和spring中切面函数一样,Lisp中的切面函数也可以在pre,post,around三种模式下被调用,这里after activate相当于是post,即该函数会在函数gdb-frame-handler-1被调用完毕后才被调用。
GDB的多窗口有两种模式,一种是程序的标准输入输出和GDB自身命令的输入输出会在分离的两个窗口显示,另一种则是程序输入输出都会在GDB命令行中一起输出,具体区别看图就知道了。
下面是分离出程序IO的多窗口模式:
下面是没有分离IO的多窗口模式:
激活分离IO模式的多窗口调试可以通过在.emacs/_emacs文件中添加:
(setq gdb-use-separate-io-buffer 1)
该语句作用是定义变量gdb-use-separate-io-buffer为非空。
如果要不单独分离出程序IO的窗口模式,则可以注释掉上面的语句,或者设置成:
(setq gdb-use-separate-io-buffer nil)
已知的问题:
如果该函数是在ECB已经被activate的情况下被调用(即在ECB环境下启动GDB)会出错。
原因应该是ECB默认的起始窗口不同,导致我代码中的(other-window 1)焦点会移动到错位的窗口上从而引发错误。可以通过在这段代码启动阶段增加重定位窗口焦点来解决,不过因为暂时还用不着ECB并且窗口函数也不熟,先不花力气了,有兴趣的人可以自己尝试。
下面也是要注意的问题,但是来自Emacs
1.Input/output窗口需要在程序运行后用鼠标滚动一下,或者按up键,才能显示出程序输出的内容,不过这应该是Emacs实现的问题,默认Emacs也是这种情况(似乎和字体大小和分辨率都相关,在我笔记本上11号Consolas字体就正常,而同样配置在台式机会出现这个问题)
2.Emacs窗口在反复最大化和窗口化过程中,窗口大小的相对比例会逐渐改变,每个水平、竖直方向的窗口大小都会慢慢变一致,水平分割的窗口平分宽度,垂直划分的窗口平分高度。不过同样这也是Emacs的问题。
- 大小: 148.2 KB
- 大小: 165.6 KB
分享到:
相关推荐
在Emacs中使用GDB调试是软件开发中的一个高效工具,尤其对于C/C++程序员来说。Emacs作为一个强大的文本编辑器,集成了GDB(GNU调试器),使得开发者可以在Emacs环境中直接进行程序的调试工作,无需离开熟悉的开发...
本文将深入探讨如何在Emacs中实现“Python-Emacs的固定和自动平衡窗口布局”,帮助用户更高效地管理工作区。 首先,Emacs提供了多窗口操作,允许用户在一个会话中同时查看和编辑多个文件。默认情况下,Emacs的窗口...
`multi-gud`可能是一个扩展,使得Emacs能够同时管理多个gdb会话,这对于多线程或分布式系统的调试非常有用。它可能提供了启动、停止、切换不同调试会话的能力,以及在不同的进程中查看和操作变量。 而`multi-gdb-ui...
这些书籍涵盖了从vi,emacs(编辑器), gcc(编译器), make(工程项目管理), gdb(调试),bash(使用最广泛的shell)等unix环境下开发所需的大部分工具的基本使用和高级功能等.基本上是某方面最经典最权威的著作.(还有一本是...
这些书籍涵盖了从vi,emacs(编辑器), gcc(编译器), make(工程项目管理), gdb(调试),bash(使用最广泛的shell)等unix环境下开发所需的大部分工具的基本使用和高级功能等.基本上是某方面最经典最权威的著作.(还有一本是...
在emacs中使用gdb,网页格式,经典。
根据提供的文件信息,以下是关于Linux下的GDB调试器使用手册中文版的知识点: 1. GDB调试器概述: - GDB是GNU下的一个强大的源代码级调试器,它可以用来调试C和C++编写的程序。 - GDB支持其他语言,包括Modula-2...
Emacs作为一个强大的文本编辑器,拥有丰富的插件和自定义功能,用户可以根据需求调整界面布局、定制快捷键、编写脚本以实现更多功能。例如,可以通过Elisp编写自定义函数来自动化一些调试任务,或者使用Emacs的Org ...
《Debugging with gdb》是GNU组织发布的开源调试工具GDB的第十版官方文档,适用于版本10.0.50.20200731-git。这本书由Richard Stallman、Roland Pesch、Stan Shebs等人共同编著,并在GNU Free Documentation License...
gdb 是一个用来调试 C 和 C++ 程序的强力调试器. 它使你能在程序运行时观察程序的内部结构和内存的使用情况. 以下是 gdb 所提供的一些功能: • 它使你能监视你程序中变量的值. • 它使你能设置断点以使程序在指定...
这些书籍涵盖了从vi,emacs(编辑器), gcc(编译器), make(工程项目管理), gdb(调试),bash(使用最广泛的shell)等unix环境下开发所需的大部分工具的基本使用和高级功能等.基本上是某方面最经典最权威的著作.如Debugging+...
在C++程序开发和调试领域,Emacs搭配GDB(GNU Debugger)插件,提供了一个高效且集成的开发环境。 首先,要利用Emacs来调试C++程序,需要先安装Emacs编辑器和GCC编译器。Emacs可以在其官方网站下载安装。GCC作为GNU...
调试单个应用程序相对简单,只需在Emacs中启动gdb,加载要调试的程序。如果要调试已运行的PostgreSQL进程,步骤稍微复杂一些: 1. 使用`xhost + :`允许`postgres`用户运行Emacs。 2. 配置环境变量,执行`. .pgsql`...
emacs-window-manager, emacs的可以自定义窗口管理器 E2WM: 均衡Emacs窗口管理器E2WM是Emacs的窗口管理器。 它可以定制弹出窗口,如何分割,如何拆分,缓冲区位于 Windows,keybinds操作 Windows 和缓冲,等等 也有...
这些书籍涵盖了从vi,emacs(编辑器), gcc(编译器), make(工程项目管理), gdb(调试),bash(使用最广泛的shell)等unix环境下开发所需的大部分工具的基本使用和高级功能等.基本上是某方面最经典最权威的著作.(还有一本是...
在Emacs这个强大的文本编辑器中,窗口管理是一项至关重要的功能,它允许用户同时处理多个文件或缓冲区。"zoom"是一个Emacs模式,专门设计用于优化和自定义窗口布局,提供固定和自动平衡的窗口体验。这个模式使得...
至于"linux emacs gdb"的标签,表明这个学习资料也涵盖了在Linux环境下使用Emacs进行调试,特别是与GDB(GNU调试器)的集成。GDB是用于C、C++等语言的调试工具,Emacs可以作为其前端,提供方便的交互式调试环境,...
3. **集成调试**:Emacs有内置的调试接口,如edebug,可以方便地调试 Lisp 代码,还有诸如 gdb 的集成,用于调试 C/C++ 等语言。 4. **版本控制系统集成**:Emacs与Git等版本控制系统无缝集成,允许用户在编辑器内部...
这些书籍涵盖了从vi,emacs(编辑器), gcc(编译器), make(工程项目管理), gdb(调试),bash(使用最广泛的shell)等unix环境下开发所需的大部分工具的基本使用和高级功能等.基本上是某方面最经典最权威的著作.(还有一本是...