在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。