Emacs 学习笔记

1 引言

Emacs除了具有强大的编辑功能,还可以作为调试工具gdb的前端,对程序进行调试。使用Emacs进行调试,可以将程序的编写与调试统一到Emacs中,并利用Emacs强大的功能辅助调试,是将Emacs作为IDE使用的一项必备功能。

 

2 将调试信息编译在程序中

 

Tools->Shell command... (或者ALT+SHIFT+1)进入Shell command:

输入

 

gcc prog.cpp -g -o prog.exe prog.cpp -g -o prog.exe
 

3 开始:开启Emacs的调试模式GUD

Tools->Debugger(或者ALT+X键。输入gdb,回车)

 

修改界面命令:

 
命令功能
gdb启动gdb进行调试
gdb-many-windows切换单窗格/多窗格模式()
gdb-restore-windows恢复窗格布局

接下来就要开始调试程序了。

 

4 调试:设置断点,控制程序流程

 

 gdb基本命令列表:   

          

 以下是实例:

 

实例:

1 新建一个源文件vi swap.cc

源文件内容如下:

#include<iostream>using namespace std;void swap(int &a,int &b){        int tmp;        tmp=a;        a=b;        b=tmp;}

int main(){        int i,j;        cout<<endl<<"Input two int number:"<<endl;        cin>>i>>j;        cout<<"Before swap(),i="<<i<<" j="<<j<<endl;        swap(i,j);        cout<<"After swap(),i="<<i<<" j="<<j<<endl<<endl;        return 0;}

直接复制粘贴生成源文件

 2.生成可执行文件 g++ -g -o swap swap.cc,注意必须使用-g参数,编译会加入调试信息,否则无法调试执行文件

3.启动调试 gdb swap

       3.1  查看源文件 list 1,回车重复上一次指令

             3.2设置调试断点 break 16,在第16行设置断点,info break查看断点信息(亦可使用缩写i b )

         3.3 调试  运行 输入run 或者

         3.3 单步调试,step 或者 s进入函数内部

                3.4查看变量 print b 或者 p b

                3.5查看函数堆栈bt,退出函数finish

                   3.6  继续运行直到下一个断点或主函数结束continue或者c

                  3.7 退出调试 输入q

 

转载:http://blog.youkuaiyun.com/wfdtxz/article/details/7368357

小结

 
功能命令默认快捷键
添加断点gud-breakC-x C-a C-b 或 C-x <SPC>
删除断点gud-removeC-x C-a C-d
运行/继续程序gud-go
单步执行,无视函数gud-nextC-x C-a C-n
单步执行,进入函数gud-stepC-x C-a C-s
跳出当前函数gud-finishC-x C-a C-f
运行到光标所在语句gud-untilC-x C-a C-u
继续运行程序gud-contC-x C-a C-r

5 察看变量的值

调试的过程中免不了要查看变更的值。Emacs提供了方便地功能让我们查看变量的值。

5.1 本地变量buffer

如果打开了gdb-many-windows,在右上角会显示Locals buffer,其中显示了当前局部变量的值。如果显示的是寄存器(Register)buffer,单击左边的Locals就可以切换到Locals buffer了。在其中可以方便地观察到各变量的值。

如果没有打开gdb-many-windows,也可以使用gdb-display-locals-buffer来显示该buffer。

5.2 察看变量值

遇到一些Locals里没有显示的变量,或者比较复杂的结构,就需要用到观察变量的功能了。

将光标停留在要观察的变量上,执行命令gud-watch,可以将变量加入观察列表中。默认的快捷键是C-x C-a C-w。也可以使用工具栏上的 查看变量

被观察的变量将在Speedbar中显示。对于复杂结构,可以单击Speedbar上的+号将其展开或收缩。在+号上按空格键也有相同的效果。2

有时候Emacs观察的变量不是你所想要的,一般是a->b这类的情况。这时可以将要观察的部分选中,再使用上述方法即可。

5.3 用工具提示显示变量值

可以用gud-tooltip-mode开启或关闭工具提示。开启后将鼠标指针停留在变量名上时将在工具提示中显示变量的值。

5.4 小结

 
功能命令默认快捷键
观察变量gud-watchC-x C-a C-w
展开/收缩变量 <SPC>
开启/关闭工具提示gud-tooltip-mode 

 

6 输入输出

如果程序需要与标准输入/输出交互,那么你很可能需要用到下面要介绍的功能。

6.1 单独的IO buffer

默认来说,程序的输入输出是在gdb buffer里显示的。这样输出信息和gdb信息混合在一起,阅读起来非常不便。这时候,你需要把输入输出单独显示在一个buffer里,方便查看。

使用gdb-use-separate-io-buffer,可以在程序代码buffer右侧新建一个IO buffer,程序对标准输入输出的操作都会重定向到这里。再执行一次该命令则会隐藏。

7 按键绑定

说实话,gud自带的按键绑定实在是麻烦,使用一个功能要三次组合键才行,小姆指按Ctrl都按酸了。所以一般将常用的按键绑定在方便的位置,这样才能有和另的IDE一样的快感。

以下是将F5、F7、F8分别绑定到gud-go、gud-step和gud-next的代码:

?View Code LISP

1
2
3
4
(add-hook 'gdb-mode-hook '(lambda ()
                            (define-key c-mode-base-map [(f5)] 'gud-go)
                            (define-key c-mode-base-map [(f7)] 'gud-step)
                            (define-key c-mode-base-map [(f8)] 'gud-next)))add-hook 'gdb-mode-hook '(lambda ()
                            (define-key c-mode-base-map [(f5)] 'gud-go)
                            (define-key c-mode-base-map [(f7)] 'gud-step)
                            (define-key c-mode-base-map [(f8)] 'gud-next)))

之所以绑定到c-mode-base-map上,是因为我基本上在代码buffer中调试。如果要在gdb-buffer中使用的话,需要使用gud-mode-map。如果想在所有buffer上使用的话,可以绑定到全局按键中:

?View Code LISP

(global-set-key [(f5)] 'gud-go)global-set-key [(f5)] 'gud-go)

 

显示行号

(global-linum-mode t) 

or

输入M-x  global-linum-mode就可以启用行号模式了

 

执行顺序:

ALT+SHIFT+1  :输入g++ a.cpp -std=c++11 -g -o 123.exe

ALT+X:输入gdb 回车 回车

ALT+X:输入gdb-many-windows   gdb-restore-windows 

ALT+X:输入global-linum-mode

 

获取更多帮主请关注小程序

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值