很多 Linux 用戶或者其他平台用戶習慣了有強大的源碼顯示窗口的調試器,可能對 GDB 用 list 顯示源碼的方式非常不習慣,主要是因為 GDB 在調試的時候不能很好地展示源碼。
GDB 中可以用 list 命令顯示源碼,但是 list 命令顯示沒有代碼高亮,也不能一眼定位到正在執行的那行代碼在整個代碼中的位置。可以毫不誇張地說,這個問題是阻止很多人長期使用 GDB 的最大障礙,如此不便,以至於 GNU 都想辦法解決了——使用 GDB 自帶的 GDB TUI。
先來看一張效果圖,是我在使用 GDB TUI 調試 redis-server 時的截圖,這樣看代碼比使用 list 命令更方便。

開啟 GDB TUI 模式
開啟 GDB TUI 模式有兩個方法。
方法一:使用 gdbtui 命令或者 gdb-tui 命令開啟一個調試。
gdbtui -q 需要調試的程序名 【用gdb -tui可以進入】
方法二:直接使用 GDB 調試代碼,在需要的時候使用切換鍵 Ctrl + X + A 調出 GDB TUI 。
GDB TUI 模式常用窗口

默認情況下,GDB TUI 模式會顯示 command 窗口和 source 窗口,如上圖所示,還有其他窗口,如下列舉的四個常用的窗口:
- (cmd)command 命令窗口,可以輸入調試命令
- (src)source 源代碼窗口, 顯示當前行、斷點等信息
- (asm)assembly 匯編代碼窗口
- (reg)register 寄存器窗口
可以通過“layout + 窗口類型”命令來選擇自己需要的窗口,例如,在 cmd 窗口輸入 layout asm 則可以切換到匯編代碼窗口。

layout 命令還可以用來修改窗口布局,在 cmd 窗口中輸入 help layout,常見的有:
Usage: layout prev | next | <layout_name>
Layout names are:
src : Displays source and command windows. asm : Displays disassembly and command windows. split : Displays source, disassembly and command windows. regs : Displays register window. If existing layout is source/command or assembly/command, the register window is displayed. If the source/assembly/command (split) is displayed, the register window is displayed with the window that has current logical focus.
另外,可以通過 winheight 命令修改各個窗口的大小,如下所示:
(gdb) help winheight Set the height of a specified window. Usage: winheight <win_name> [+ | -] <#lines> Window names are: src : the source window cmd : the command window asm : the disassembly window regs : the register display ##將代碼窗口的高度擴大 5 行代碼 winheight src + 5 ##將代碼窗口的高度減小 4 代碼 winheight src - 4
當前 GDB TUI 窗口放大或者縮小以后,窗口中的內容不會自己刷新以適應新的窗口尺寸,我們可以通過 space 鍵強行刷新 GDB TUI 窗口。
窗口焦點切換
在默認設置下,方向鍵和 PageUp/PageDown 都是用來控制 GDB TUI 的 src 窗口的,因此,我們常用上下鍵顯示前一條命令和后一條命令的功能就沒有了,不過可以通過 Ctrl + N/Ctrl + P 來獲取這個功能。
注意:通過方向鍵調整了GDB TUI 的 src 窗口以后,可以用 update 命令重新把焦點定位到當前執行的代碼上。
我們可以通過 focus 命令來調整焦點位置,默認情況下焦點是在 src 窗口,通過 focus next 命令可以把焦點移到 cmd 窗口,這時候就可以像以前一樣,通過方向鍵來切換上一條命令和下一條命令。同理,也可以使用 focus prev 切回到源碼窗口,如果焦點不在 src 窗口,我們就不必使用方向鍵來瀏覽源碼了。
(gdb) help focus help focus Set focus to named window or next/prev window. Usage: focus {<win> | next | prev} Valid Window names are: src : the source window asm : the disassembly window regs : the register display cmd : the command window
小結
GDB TUI 提供了一個可視化的代碼閱讀功能,比使用 list 命令來查看代碼要方便不少,有興趣的讀者可以嘗試一下。
=======================
直接上CGDB,那個才是神器!
