在emacs 里使用gdb
在emacs 里使用gdb
M-x gdb 就在emacs里启动了gdb
- 在gdb窗口里
shell-mode的命令都适用 - 启动gdb后,再启动minor mode:
M-x gud-tooltip-mode,当鼠标放到变量上后,会弹出tooltip来显示变量的值。 - 要想使用
gud-tooltip-mode功能,必须把自己的主mode添加到变量gud-tooltip-modes里。变量gud-tooltip-modes的默认值: (gud-mode c-mode c++-mode fortran-mode python-mode)
一,由于在X 窗口的emacs环境里使用gdb的话,有时会自动弹出frame,所以就需要在frame之间来回切换。所以先介绍一下frame相关的命令。
- frame的切换的键绑定,基本和window一样,只不过以
c-x 5开头。 - C-x 5 2 :Create a new frame (
make-frame-command). - C-x 5 b bufname 回车 :Select buffer bufname in another frame. This runs
switch-to-buffer-other-frame. - C-x 5 f filename 回车:Visit file filename and select its buffer in another frame. This runs
find-file-other-frame - C-x 5 d directory 回车:Select a Dired buffer for directory directory in another frame. This runs
dired-other-frame. - C-x 5 0 :Delete the selected frame (
delete-frame). - C-x 5 o :Select another frame, and raise it. If you repeat this command, it cycles through all the frames on your terminal.
- C-x 5 1 :Delete all frames on the current terminal, except the selected one.
- M-F10:最大化最小化fram。
二,gdb相关命令:
注意:执行下面命令的前提是,光标在source buffer,不是在gdb buffer。
- C-x C-a C-b (
gud-break) :在光标所在行,设置断点。 - C-x C-a C-l (
gud-refresh) :从硬盘重新加载源代码内容到当前缓冲区。 - C-x C-a C-s (
gud-step) :进入函数,停在此函数的第一行 - C-x C-a C-n (
gud-next) :不进入函数,执行到下一行。 - C-x C-a C-i (
gud-stepi) :不明 - C-x C-a C-p (
gud-print) :计算光标所在位置的表达式,把计算结果显示到gdb buffer上。如果显示的不是你想要的,则选择你要计算的表达式。 - C-x C-a C-r :继续执行,直到遇到断点,或者停在光标所在的行。
- C-x C-a C-d (
gud-remove):删除光标所在行的断点。 - C-x C-a C-t (
gud-tbreak) :在光标所在行,设置临时断点。什么是临时断点?当此断点所在行被执行后,这个临时断点自动被删除。 - C-x C-a < (
gud-up):执行这个命令的前提是已经进入到某个函数里了。执行后跳到调用此函数的地方。 - C-x C-a > (
gud-down):执行这个命令的前提是已经进入到某个函数A里了。然后执行C-x C-a < ,跳到调用此函数A的地方后,再执行此命令后,跳回函数A里。 - C-x C-a C-u (
gud-until) :继续执行,直到遇到断点,或者停在光标所在的行。 - C-x C-a C-f (
gud-finish): 在某个函数里面执行此命令后,把此函数全部执行完后,停在调用此函数的下一行。 - C-x C-a C-j (gud-jump ):继续执行,停在光标所在的行。无视此行与光标所在行之间的所有断点。
- TAB:在gdb buffer里,自动补全。c-q TAB 打印TAB在gdb buffer。
下图的红点是断点,白色的箭头是程序执行到这行了。

三,gdb钩子:gdb-mode-hook
设置gdb调试代码时的快捷键
(add-hook 'gdb-mode-hook
(lambda ()
(gud-tooltip-mode);;minor mode当鼠标放到变量上后,会弹出tooltip来显示变量的值
(local-set-key [f5] 'gud-step);;进入函数
(local-set-key [f6] 'gud-next);;不进入函数,到下一行
(local-set-key [f7] 'gud-finish);;跳出函数
(local-set-key [f8] 'gud-until)));;继续执行
四,多窗口gdb
当变量gdb-many-windows 的值是非nil时,执行M-x gdb后,打开的窗口如下:

使用命令M-x gdb-many-windows 也可以打开上面的多窗口。
这些多个窗口乱了以后,可以用M-x gdb-restore-windows ,把窗口回复成上面的样子。
还可以使用M-x gdb-display-buffertype-buffer or M-x gdb-frame-buffertype-buffer ,打开想看的buffer。用frame的话,buffer就在新的frame里打开;用buffer的话,就在现在的frame里打开。
buffertype:
- breakpoints:断点
- stack:函数调用
- locals:变量
- io:输入输出
- registers:寄存器
- disassemble:汇编
- memory:内存
- threads:线程。
Breakpoints Buffer里的键盘操作
- 空格:让断点有效/无效。无效断点含义:在此处不停。
- D:删除断点
- 回车:显示断点处的代码
Threads Buffer里的键盘操作
- 回车:选择线程
- d/D:打开disassembly buffer 在当前frame或者新的frame
- f/F:打开Stack buffer 在当前frame或者新的frame
- l/L:打开Locals buffer 在当前frame或者新的frame
- r/R:打开Registers buffer 在当前frame或者新的frame
Stack Buffer里的键盘操作
- 回车:切换call stack,在切换的同时,locals buffer里的变量就变成了你要切换到的stack里的变量了。
locals Buffer里的键盘操作
- 回车:修改变量的值
Registers Buffer里的键盘操作
- 回车:修改寄存器的值
Memory Buffer里的键盘操作
The memory buffer lets you examine sections of program memory (see Memory). Click mouse-1 on the appropriate part of the header line to change the starting address or number of data items that the buffer displays. Alternatively, use S or N respectively. Click mouse-3 on the header line to select the display format or unit size for these data items.
Watch Expressions
C-x C-a C-w (gud-watch):在source buffer把光标移动到一个变量或者表达式上,执行这个命令后,这个变量或者表达式就会显示到speedbar上。如下图:

如果查看的是结构体,类等的话,就会以树状显示,效果如下:

空格:当查看的变量的结构体时,在speedbar上这个结构体是未展开的,在结构体上按空格后就会展开它。
D (gdb-var-delete) :在speedbar上,光标落到你要删除的变量,执行这个命令后,从speedbar上把这个变量删除掉。
回车:在speedbar上,光标落到你要修改值的变量,执行这个命令后,值被修改。
变量【gdb-show-changed-values 】:如果非nil,则使用face:font-lock-warning-face 高亮显示值发生变化的变量。默认值是非nil。
变量【gdb-delete-out-of-scope 】:如果非nil,当程序执行到变量的scope的外面是,会自动从speedbar里把这个变量删除。如果你要多次调试某个函数,可以把它设置成nil。默认值是非nil。
变量【gdb-use-colon-colon-notation 】:如果非nil,使用
function::variable的格式显示变量,这样一来就可以显示名字相同但是在不同函数里的变量了。默认值是nil。变量【gdb-speedbar-auto-raise 】:如果非nil,当watch的变量值发生变化后,speedbar就会变成当前活动窗口。当你全屏调试代码时,speedbar就被emacs遮挡了,当这个变量的值发生变化了,speedbar就会自动蹦到emacs窗口的前面,你就知道这个变量发生变化了。默认值是nil。
Multithreaded Debugging
c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854
在emacs 里使用gdb的更多相关文章
- emacs 入门第一课:Emacs里的基本概念
Table of Contents 无聊的开场白 buffer(缓冲区) window(窗口)与frame Emacs的mode Emacs Lisp 函数function.命令command.键绑定 ...
- 在emacs里用w3m浏览网页
给w3m配置个~/.emacs老是暴错误,在配置里把这个注掉就OK了;(require 'mime-w3m) ;;支持w3m (add-to-list 'load-path "/usr/sh ...
- Linux下Eclipse里用gdb调试JNI里C/C++
1,给Eclipse安装CDT插件 2,先以Debug方式运行java程序,停在java代码的断点上 3,Debug Configuration里选择C/C++ Attach to Applicati ...
- emacs semantic,speedbar,gdb汇总
在emacs 里使用gdb emacs speedbar功能介绍 semantic功能介绍 上面3篇文章精华,都汇总到下面的.emacs文件里了. ;;启动semantic功能 (semantic-m ...
- (转)完全用GNU/Linux工作 by 王珢
完全用GNU/Linux工作 王珢 (看完这篇博文,非常喜欢王珢的这篇博客,也我坚定了学gnu/linux的决心,并努力去按照国外的计算机思维模式去学习编程提高自己.看完这篇文章令我热血沸腾 ...
- 清华申请退学博士作品:完全用Linux工作
http://www.cnblogs.com/cbscan/articles/3252872.html 下文地址 http://blog.oldboyedu.com/use-linux/ 按: 尽管我 ...
- 王垠:完全用Linux工作
来自: Zentaur(alles klar) 录一篇旧文 作者:王垠 完全用Linux工作,抛弃windows 我已经半年没有使用 Windows 的方式工作了.Linux 高效的完成了我所有的工作 ...
- 一个LINUX狂人的语录(个人认为很精辟)
http://blog.chinaunix.net/uid-57160-id-2734431.html?page=2 我已经半年没有使用 Windows 的方式工作了.Linux 高效的完成了我所有的 ...
- 为何要使用Linux
摈弃 Windows 低效率的工作方式,发掘 Linux 身上的 UNIX 气质 我已经半年没有使用 Windows 的方式工作了.Linux 高效的完成了我所有的工作. GNU/Linux 不是每个 ...
随机推荐
- [转]JS将图片转为base64编码
本文转自:https://blog.csdn.net/DeMonliuhui/article/details/79731359 1.根据img标签获取base64编码/** * * @param im ...
- SAP 客户信贷重建一则
前段时间接到业务的一个需求,需要将标准和定制业务的信贷分开.原来目前公司是将标准和定制的客户信贷金额整在一起,共用一个信贷范围.而定制业务特殊性决定了公司要收到客户全款才会接单生产并发货,而客户打预收 ...
- MySQL常见的8种SQL错误用法
MySQL常见的8种SQL错误用法 前言 MySQL在2016年仍然保持强劲的数据库流行度增长趋势.越来越多的客户将自己的应用建立在MySQL数据库之上,甚至是从Oracle迁移到MySQL上来.但也 ...
- HTML技巧篇:实现元素水平与垂直居中的几种方式
如何使用html+css实现元素的水平与垂直居中效果,这也是我们网页在编码制作中会经常用到的问题. 1)单行文本的居中 主要实现css代码: 水平居中:text-align:center;垂直居中:l ...
- OSPF和ACL的应用
1.创建拓扑图 2.配置基本网络 3.配置OSPF (1)在R1上配置 (2)在R2上配置 (3)在R3上配置 (4)在IT上配置 4.配置ACL (1)在R3上配置 (2)在R2上配置 (3) ...
- 使用 github pages快速部署自己的静态网页
看见很多大神在Github Pages上部署Demo,感觉效果还不错,刚才自己也试了一下,发现其实并不难! 选择 github pages 的理由 使用零成本: github pages 集成在 gi ...
- 微信小程序开发——websocket测试
服务端 在windows下执行 node server.js 也可参照我的前一篇部署https var httpServ = require('http') var WebSocketServer ...
- 【洛谷4585】[FJOI2015] 火星商店问题(线段树分治)
点此看题面 大致题意: 有\(n\)家店,每个商品有一个标价.每天,都可能有某家商店进货,也可能有某人去购物.一个人在购物时,会于编号在区间\([L_i,R_i]\)的商店里挑选一件进货\(d_i\) ...
- 【Nginx】Nginx反向代理转发Host设置
#事故现场: 服务器A(Nginx服务器):192.168.2.126 服务器B(Web服务器):192.168.2.221 服务器A反向代理服务器B,A配置了upstream为: http { up ...
- body标签添加ontouchstart属性
之前看别人的代码,发现他的body标签添加ontouchstart属性.即 <body ontouchstart> 上网查了一下原因,记录一下: 这个操作是进行手机端兼容处理的,防止伪类: ...