emacs gdb调试

1 引言

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

本文假定读者具有基本的程序调试知识,希望知道在Emacs下进行基本调试的对应操作。水平有限,欢迎拍砖。

2 准备工作:将调试信息编译在程序中

要使程序能被gdb调试,需要在编译时加入调试所需的信息。如果使用gcc/g++进行编译,需要使用参数-g,如:

? View Code BASH
gcc prog.c -g -o prog

如果使用 ./confiugre && make 的编译流程,可以将使用如下方式引入-g参数:

? View Code BASH
1
2
CFLAGS="-g" ./configure
make

注意:不要加入任何优化参数(例如-O、-O2),不然调试时会有很灵异的现象发生……

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

3.1 运行gdb

在编译好程序后,就可以开始调试了。直接运行gdb命令M-x gdb RET 在minibuffer中会出现需要执行的gdb命令。例如:gdb –annotate=3 prog 如果当前目录下有可执行文件(通常恰好是需要调试的文件),gdb会在其后自动补上可执行文件,否则需要在minibuffer中补上要调试的程序文件 名。

继续回车,Emacs的GUD(Grand Unified Debugger)就会关联到gdb并加载要调试的程序了。

3.2 gdb界面

启动gdb后,Emacs的界面会变成下面两种之一:

Emacs gdb 配置和使用 - lubobill1990 - 小波的从前 现在 将来

GDB单窗格模式

Emacs gdb 配置和使用 - lubobill1990 - 小波的从前 现在 将来

GDB多窗格模式

可以通过gdb-many-windows来切换这两种界面布局。

如果界面被打乱了(例如,在minibuffer中使用补全,查看帮助,重新编译程序),可以使用gdb-restore-windows来恢复界面布局。

3.3 小结

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

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

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

4.1 设置、删除断点

首先将断点设置在要调试的地方。有两种方法:

第一种,在要设置断点的行左边的fringe上单击一下(就是文本左边与滚动条之间空出的那一块)。隐藏了fringe的朋友可以M-x fringe-mode显示它。

第二种,使用默认快捷键C-x C-a C-b, 或者 C-x <SPC>。它们都关联到命令gud-break。

无论使用哪种方法,fringe上都会在设置了断点的行上显示一个红点,表示这行设了断点:

Emacs gdb 配置和使用 - lubobill1990 - 小波的从前 现在 将来

fringe上的断点标记

同时,在断点buffer中也会显示已有的断点信息:

Emacs gdb 配置和使用 - lubobill1990 - 小波的从前 现在 将来

断点buffer

要删除断点,同样有两种对应的方法:在fringe的断点上单击一下,或者使用快捷键C-x C-a C-d(对应命令gud-remove)。

可以在断点buffer上单击某个断点切换到断点所在位置。将光标移动到断点处回车也有同样的效果。

在断点buffer上按空格键可以切换断点的激活和禁用状态。

4.2 运行程序

设置好断点后就可以运行程序了。单击工具栏上的运行就开始运行了。也可以使用gud-go命令来运行。奇怪的是没有任何默认快捷键绑定。

当程序运行到断点时,程序会在断点处停下来,并自动打开停下的语句所在的代码文件。同时在fringe上在停下的语句处有三角形的指示器。

Emacs gdb 配置和使用 - lubobill1990 - 小波的从前 现在 将来

当前语句指示器

现在,我们来一步步运行程序。

4.3 单步执行、运行到光标处

在调试中最常用的功能就是单步执行了。单步执行有两种:将函数调用作为一条语句执行(Next)和遇到函数时进入函数中进行调试(Step)。

要使用第一种方式,默认快捷键是C-x C-a C-n,对应命令为gud-next。也可以单击工具栏上的 单步运行跳过函数 。

第二种方式的默认快捷键是C-x C-a C-s,对应命令为gud-step。也可以单击工具栏上的 单步运行进入函数 。

如果想跳出当前函数,可以使用命令gud-finish,默认快捷键为C-x C-a C-f,工具栏上有 跳出函数 可用。

在Emacs中还可以运行到光标所在的行。使用命令gud-until即可,默认快捷键为C-x C-a C-u。1

也可以直接把当前语句指示器拖到任意一行,程序会运行到那一行再停下来。

4.4 继续运行程序

在程序中断后要继续运行程序,依然是使用gud-go命令或 继续运行 ,也可以使用命令gud-cont,对应快捷键为C-x C-a C-r。

4.5 小结

功能命令默认快捷键
添加断点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这类的情况。这时可以将要观察的部分选中,再使用上述方法即可。

Emacs gdb 配置和使用 - lubobill1990 - 小波的从前 现在 将来

在Speedbar中观察变量

5.3 用工具提示显示变量值

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

Emacs gdb 配置和使用 - lubobill1990 - 小波的从前 现在 将来

在工具提示中显示变量的值

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,程序对标准输入输出的操作都会重定向到这里。再执行一次该命令则会隐藏。

Emacs gdb 配置和使用 - lubobill1990 - 小波的从前 现在 将来

IO buffer

6.2 输入数据

需要输入数据的时候,只需要在IO buffer中输入数据回车即可。已经输入的数据会被加粗,以和输出信息区分开来。

6.3 重定向到文件

有时候我们已经准备好了用于输入的数据在文件中,以避免调试时烦琐的输入。这时候就需要在调试时进行输入输出重定向了。

要进行重定向,只能使用gdb自带的功能。在gdb buffer中输入 run < data.in > data.out 就可以将标准输入重定向到data.in,将标准输出重定向到data.out了。

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)))

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

? View Code LISP
(global-set-key [(f5)] 'gud-go)

8 结尾

有了调试功能,Emacs作为一个IDE才算是完整了。本文介绍了在Emacs下使用gdb调试的基本方法,Emacs的调试功能还远不止这些,进一步学习可参阅 Emacs Manual 的 Debuggers 一节。

由于我也是边学边写,一定有许多不足或者错误,还请各位多多指教。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要安装Linux Mint系统并编辑、编译和调试程序,首先要下载安装Linux Mint系统,然后安装必要的编辑器,如Vim、Emacs等,以及编译器,如gcc、g++等。然后可以使用编辑器编辑源代码,使用编译器编译源程序,最后利用调试器调试程序,以获得最终运行结果。 ### 回答2: 安装Linux Mint系统是一项相对简单的任务,以下是安装步骤: 1. 下载Linux Mint的安装镜像文件,通常是一个ISO文件。 2. 制作安装介质,可以是刻录成光盘或者制作成USB启动盘。 3. 将安装介质插入电脑并重启计算机。 4. 进入计算机的BIOS设置,将启动顺序调整为先从光盘或者USB启动盘启动。 5. 重启计算机,按照提示选择安装Linux Mint系统。 6. 在安装过程中,选择适当的语言和时区,设置用户名和密码等信息。 7. 选择安装方式,可以选择与其他操作系统共存,或者覆盖原有系统。 8. 等待安装完成,重启计算机。 安装完成后,在Linux Mint系统中可以使用自带的文本编辑器(如gedit)来编辑、编译和调试程序。下面是一个简单的例子,以C语言为例: 1. 打开终端,输入以下命令来安装gcc编译器: ``` sudo apt-get install build-essential ``` 2. 创建一个新的C语言源文件,比如hello.c,例如使用gedit编辑器: ``` gedit hello.c ``` 3. 在打开的文本编辑器窗口中,输入以下代码: ```c #include <stdio.h> int main() { printf("Hello, World!\n"); return 0; } ``` 4. 保存文件并关闭文本编辑器。 5. 在终端中使用gcc编译器编译源代码并生成可执行文件,比如使用以下命令: ``` gcc -o hello hello.c ``` 6. 运行生成的可执行文件,例如使用以下命令: ``` ./hello ``` 7. 在终端中会显示输出结果,即 "Hello, World!"。 这样,你就成功编辑、编译和调试了一个简单的C语言程序。 ### 回答3: 安装Linux Mint系统是一个比较简单的过程。首先,你需要准备一个空的USB闪存驱动器或者光盘,并下载最新的Linux Mint.iso镜像文件。然后,根据你的设备选择UEFI或者Legacy模式来引导系统。接下来,按照屏幕上的指示进行安装。在分区的过程中,你可以选择删除旧的操作系统,或者将Linux Mint安装在另一个分区。 安装完毕后,你可以使用自带的文本编辑器如gedit、nano或者vim来编辑编译和调试程序。Linux Mint系统已经预装了许多常用的开发工具,如GCC编译器。你可以在终端中运行以下命令来确认GCC是否已经安装: gcc -v 如果GCC未安装,你可以运行以下命令来安装它: sudo apt-get install build-essential 编辑程序可以使用任何文本编辑器,如gedit。你可以使用以下命令在终端中打开gedit: gedit 然后,在gedit中编写你的程序代码,并保存文件。假设你保存的文件名为example.c。 调试程序可以使用GNU Debugger(GDB)来进行。GDB是一个非常强大的调试工具,可以帮助你检测和修复程序中的错误。你可以使用以下命令安装GDB: sudo apt-get install gdb 运行GDB调试器的命令如下: gdb ./example 这会将GDB加载到你的程序中。你可以使用GDB提供的命令来设置断点、单步执行、查看变量值等等。 总的来说,安装Linux Mint系统并在其中编辑编译和调试程序是一个简单的过程。你只需要按照指导进行安装,然后使用终端和相应的工具就可以轻松完成这些任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值