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 或者r
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-break | C-x C-a C-b 或 C-x <SPC> |
删除断点 | gud-remove | C-x C-a C-d |
运行/继续程序 | gud-go | 无 |
单步执行,无视函数 | gud-next | C-x C-a C-n |
单步执行,进入函数 | gud-step | C-x C-a C-s |
跳出当前函数 | gud-finish | C-x C-a C-f |
运行到光标所在语句 | gud-until | C-x C-a C-u |
继续运行程序 | gud-cont | C-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-watch | C-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
| |
之所以绑定到c-mode-base-map上,是因为我基本上在代码buffer中调试。如果要在gdb-buffer中使用的话,需要使用gud-mode-map。如果想在所有buffer上使用的话,可以绑定到全局按键中:
?View Code LISP
|
显示行号
(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
获取更多帮主请关注小程序