zoukankan      html  css  js  c++  java
  • 在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

  • 相关阅读:
    hdu 5119 Happy Matt Friends
    hdu 5128 The E-pang Palace
    hdu 5131 Song Jiang's rank list
    hdu 5135 Little Zu Chongzhi's Triangles
    hdu 5137 How Many Maos Does the Guanxi Worth
    hdu 5122 K.Bro Sorting
    Human Gene Functions
    Palindrome(最长公共子序列)
    A Simple problem
    Alignment ( 最长上升(下降)子序列 )
  • 原文地址:https://www.cnblogs.com/xiaoshiwang/p/11912383.html
Copyright © 2011-2022 走看看