在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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM