`
ppgunjack
  • 浏览: 80216 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

改造Emacs GDB调试的多窗口布局

阅读更多

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调试

    介绍在Emacs下如何使用GDB进行调试。

    emacs的调试界面像VC一样

    这个功能插件可以使emacs的调试界面像VC一样,有watch, stacktrace等窗口,真正实现图形化gdb.

    vi+Emacs+GCC+Make+GDB+Bash经典书籍8

    这些书籍涵盖了从vi,emacs(编辑器), gcc(编译器), make(工程项目管理), gdb(调试),bash(使用最广泛的shell)等unix环境下开发所需的大部分工具的基本使用和高级功能等.基本上是某方面最经典最权威的著作.(还有一本是...

    vi+Emacs+GCC+Make+GDB+Bash经典书籍6

    这些书籍涵盖了从vi,emacs(编辑器), gcc(编译器), make(工程项目管理), gdb(调试),bash(使用最广泛的shell)等unix环境下开发所需的大部分工具的基本使用和高级功能等.基本上是某方面最经典最权威的著作.(还有一本是...

    using gdb in emacs

    在emacs中使用gdb,网页格式,经典。

    Python-Emacs的固定和自动平衡窗口布局

    通过强制执行固定和自动平衡布局来管理窗口大小

    emacs-gdb:GNU Emacs的GDB图形界面

    emacs-gdb:GNU Emacs的GDB图形界面

    vi+Emacs+GCC+Make+GDB+Bash经典书籍

    这些书籍涵盖了从vi,emacs(编辑器), gcc(编译器), make(工程项目管理), gdb(调试),bash(使用最广泛的shell)等unix环境下开发所需的大部分工具的基本使用和高级功能等.基本上是某方面最经典最权威的著作.如Debugging+...

    emacs-window-manager, emacs的可以自定义窗口管理器.zip

    emacs-window-manager, emacs的可以自定义窗口管理器 E2WM: 均衡Emacs窗口管理器E2WM是Emacs的窗口管理器。 它可以定制弹出窗口,如何分割,如何拆分,缓冲区位于 Windows,keybinds操作 Windows 和缓冲,等等 也有...

    vi+Emacs+GCC+Make+GDB+Bash经典书籍4

    这些书籍涵盖了从vi,emacs(编辑器), gcc(编译器), make(工程项目管理), gdb(调试),bash(使用最广泛的shell)等unix环境下开发所需的大部分工具的基本使用和高级功能等.基本上是某方面最经典最权威的著作.(还有一本是...

    如何利用Emacs来调试C++程序

    本人觉得,Emacs之所以厉害,是因为许多在其他编辑器下必须用鼠标点选很多步的操作,在Emacs下都可以通过键盘来完成。大大地节省了你在显示器上找按钮的时间。Emacs在Linux上运行感觉比windows流畅些,用Emacs编辑...

    zoom:Emacs的固定和自动平衡窗口布局

    zoom:Emacs的固定和自动平衡窗口布局

    vi+Emacs+GCC+Make+GDB+Bash经典书籍7

    这些书籍涵盖了从vi,emacs(编辑器), gcc(编译器), make(工程项目管理), gdb(调试),bash(使用最广泛的shell)等unix环境下开发所需的大部分工具的基本使用和高级功能等.基本上是某方面最经典最权威的著作.(还有一本是...

    vi+Emacs+GCC+Make+GDB+Bash经典书籍3

    这些书籍涵盖了从vi,emacs(编辑器), gcc(编译器), make(工程项目管理), gdb(调试),bash(使用最广泛的shell)等unix环境下开发所需的大部分工具的基本使用和高级功能等.基本上是某方面最经典最权威的著作.(还有一本是...

    multicolumn:Emacs 的多个并排窗口支持包

    这个包提供了 Emacs 的“缺失功能”,用于创建并排布局、高效导航和管理窗口。 这个包在与跟随模式结合使用时特别有用,Emacs 提供的一个包创建了几个显示相同缓冲区的窗口形成一个非常高的虚拟窗口的错觉。 例如...

    emacs开发js插件

    emacs中配置javascript的插件,很好用,配置说明见http://blog.csdn.net/xljiulong/article/details/7829805

    vi+Emacs+GCC+Make+GDB+Bash经典书籍1

    这些书籍涵盖了从vi,emacs(编辑器), gcc(编译器), make(工程项目管理), gdb(调试),bash(使用最广泛的shell)等unix环境下开发所需的大部分工具的基本使用和高级功能等.基本上是某方面最经典最权威的著作.如Debugging+...

    vi+Emacs+GCC+Make+GDB+Bash经典书籍2

    这些书籍涵盖了从vi,emacs(编辑器), gcc(编译器), make(工程项目管理), gdb(调试),bash(使用最广泛的shell)等unix环境下开发所需的大部分工具的基本使用和高级功能等.基本上是某方面最经典最权威的著作.(还有一本是...

    vi+Emacs+GCC+Make+GDB+Bash经典书籍5

    这些书籍涵盖了从vi,emacs(编辑器), gcc(编译器), make(工程项目管理), gdb(调试),bash(使用最广泛的shell)等unix环境下开发所需的大部分工具的基本使用和高级功能等.基本上是某方面最经典最权威的著作.(还有一本是...

Global site tag (gtag.js) - Google Analytics