在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

最新文章

  1. 利用MetaWeblog API实现XMLRPC写博客功能
  2. js高级程序设计(七)函数表达式
  3. [AS3] 问个很囧的问题: 如何遍历Dictionary?
  4. jboss7 添加虚拟目录 上传文件路径
  5. iOS进阶学习-数据处理之文件读写
  6. Spark RDD Persistence
  7. 如何学习.Net的步骤
  8. CentOs Linux 文件位置标记
  9. PHP+js实现图片上传,编辑
  10. 用StringBuilder和StringBuffer实现的Unicode解码方法的比较(Java)
  11. Re.多项式除法/取模
  12. Linux设备树(六 memory&amp;chosen节点)
  13. 将逗号分隔的字符串转换为Python中的列表
  14. php微信公众号开发入门小教程
  15. Linux驱动之输入子系统简析
  16. c++读入优化
  17. webpack 4 升级点
  18. 【BZOJ】【3931】【CQOI2015】网络吞吐量
  19. SpringBoot系列三:SpringBoot基本概念(统一父 pom 管理、SpringBoot 代码测试、启动注解分析、配置访问路径、使用内置对象、项目打包发布)
  20. leetcode 120. 三角形最小路径和 JAVA

热门文章

  1. python-初始网络编程
  2. PHP生成唯一ID
  3. JAVA学习路线,实战开发
  4. python3解决url编码与解码
  5. leetcode 752. 打开转盘锁
  6. AD软件笔记
  7. 用arthas的watch方法观察执行方法的输入输出
  8. linux编程fcntl获取和设置文件锁
  9. isinstance和issubclass
  10. python3编码问题总结