在 Linux 終端用 GCC 編譯、GDB 調試、反彙編查看底層指令,是 C/C++ 程序員必備基本功。本文以 Ubuntu 14.04 為例,手把手演示全流程,並附常見問題答疑。
編寫 helloworld.c
#includeint main() { printf("Hello World\n"); return 0; }
編譯與執行
gcc -o helloworld helloworld.c # -o 指定輸出文件名 ./helloworld # ./ 表示當前目錄下執行 # 輸出: Hello World!
gdb ./helloworld (gdb) disas main # 反彙編 main 函數 # 輸出 x86_64 指令碼,如 push %rbp, mov %rsp,%rbp, call printf 等

編寫帶循環、函數調用的程序,觀察 call、jmp、棧幀建立/銷毀指令。

vi a.c # 用 vi 編輯器創建 .c 文件 # 輸入代碼,按 Esc,輸入 :wq 保存退出 gcc a.c # 編譯生成 a.out ./a.out # 執行
編輯器選擇: Vim 經典、Emacs 強大、Gedit 圖形友好,任選其一。
安裝命令(按發行版):
# RedHat/CentOS/Fedora/SUSE yum install gcc gdb vim # Debian/Ubuntu sudo apt-get install gcc gdb vim # 若有 rpm/deb 包 rpm -ivh pkg.rpm dpkg -i pkg.deb
調試技巧: 編譯加 -g 保留符號表:gcc -g a.c -o a,GDB 才能顯示變量名、行號。
| 參數 | 作用 |
|---|---|
-o file | 指定輸出文件名 |
-g | 生成調試信息(GDB 必需) |
-Wall | 開啟所有常見警告 |
-O2 | 優化等級 2(發布版推薦) |
-std=c11 | 指定 C 標準版本 |
-c | 只編譯不鏈接,生成 .o |
break main # 在 main 斷點 run # 運行程序 next / step # 單步跳過/進入 print var # 打印變量值 info registers # 查看寄存器 bt # 回溯棧幀 quit # 退出 GDB
熟練掌握「編寫 → 編譯 → 調試 → 反彙編」閉環,是從寫代碼走向理解計算機系統運行本質的關鍵一步。