在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的更多相关文章

  1. emacs 入门第一课:Emacs里的基本概念

    Table of Contents 无聊的开场白 buffer(缓冲区) window(窗口)与frame Emacs的mode Emacs Lisp 函数function.命令command.键绑定 ...

  2. 在emacs里用w3m浏览网页

    给w3m配置个~/.emacs老是暴错误,在配置里把这个注掉就OK了;(require 'mime-w3m) ;;支持w3m (add-to-list 'load-path "/usr/sh ...

  3. Linux下Eclipse里用gdb调试JNI里C/C++

    1,给Eclipse安装CDT插件 2,先以Debug方式运行java程序,停在java代码的断点上 3,Debug Configuration里选择C/C++ Attach to Applicati ...

  4. emacs semantic,speedbar,gdb汇总

    在emacs 里使用gdb emacs speedbar功能介绍 semantic功能介绍 上面3篇文章精华,都汇总到下面的.emacs文件里了. ;;启动semantic功能 (semantic-m ...

  5. (转)完全用GNU/Linux工作 by 王珢

    完全用GNU/Linux工作 王珢      (看完这篇博文,非常喜欢王珢的这篇博客,也我坚定了学gnu/linux的决心,并努力去按照国外的计算机思维模式去学习编程提高自己.看完这篇文章令我热血沸腾 ...

  6. 清华申请退学博士作品:完全用Linux工作

    http://www.cnblogs.com/cbscan/articles/3252872.html 下文地址 http://blog.oldboyedu.com/use-linux/ 按: 尽管我 ...

  7. 王垠:完全用Linux工作

    来自: Zentaur(alles klar) 录一篇旧文 作者:王垠 完全用Linux工作,抛弃windows 我已经半年没有使用 Windows 的方式工作了.Linux 高效的完成了我所有的工作 ...

  8. 一个LINUX狂人的语录(个人认为很精辟)

    http://blog.chinaunix.net/uid-57160-id-2734431.html?page=2 我已经半年没有使用 Windows 的方式工作了.Linux 高效的完成了我所有的 ...

  9. 为何要使用Linux

    摈弃 Windows 低效率的工作方式,发掘 Linux 身上的 UNIX 气质 我已经半年没有使用 Windows 的方式工作了.Linux 高效的完成了我所有的工作. GNU/Linux 不是每个 ...

随机推荐

  1. vue v-if和v-show的区别

    其中v-if依赖于控制DOM节点,而v-show是依赖于控制DOM节点的display属性. 当v-show传入的值为true时,对应DOM元素的display的值为block之类的,反之为false ...

  2. ORA-39901 EXPDP分区报错/分区表删除不完全

    [oracle@localhost zgy]$ expdp orders/orders directory=DUMPDIR DUMPFILE=test_exp.dmp TRANSPORT_TABLES ...

  3. idea延长使用期

    0. 如果你的idea(版本2019.02)是已过期状态则先上网找个激活码激活再进行下面步骤延长使用期至2089年 1. 附件下载地址: 链接:https://pan.baidu.com/s/1L5O ...

  4. python中copy()和deepcopy()详解

    **首先直接上结论: —–我们寻常意义的复制就是深复制,即将被复制对象完全再复制一遍作为独立的新个体单独存在.所以改变原有被复制对象不会对已经复制出来的新对象产生影响.—–而浅复制并不会产生一个独立的 ...

  5. ACWING 844. 走迷宫

    地址 https://www.acwing.com/problem/content/description/846/ 给定一个n*m的二维整数数组,用来表示一个迷宫,数组中只包含0或1,其中0表示可以 ...

  6. 解决Fiddler在win7系统下的安全证书问题

    如果电脑win7系统,一直解决不了Fiddler的证书安装问题,可以试试下面的办法. 在安装证书的时候一直遇到这个问题. 这是因为win7系统的在.net Framework4.0上面的bug引起的. ...

  7. 利用re处理数据

    re模块为Python提供正则表达式功能,我们可以用它来处理数据 大多数时候我们用Python读取文件数据读进来都是字符串,想要提取里面想要的数据用正则表达式是个很不错的手段 下面是一个从读取数据中提 ...

  8. Codeforces Round #597 (Div. 2) E. Hyakugoku and Ladders 概率dp

    E. Hyakugoku and Ladders Hyakugoku has just retired from being the resident deity of the South Black ...

  9. Mybatis和Hibernate框架的区别

    Mybatis和Hibernate框架的区别1 简单简介 1.1 Hibernate 框架 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,建立对象与数据 ...

  10. Fuzzy finder(fzf+vim) 使用入门指南

    今天无意中尝试了fzf,才发现这个工具的威力无穷,毕竟是非常好的工具,第一次都把它的优点都释放出来也不现实,先熟悉一下吧,后面在实战中再不断地学习总结. 它是什么: Fuzzy finder 是一款使 ...