從Windows轉到Linux下已經有一段時間了,每次刷算法題碰到問題需要調試的時候,就分分鐘想關機,切換到Windows上調試。於是,花了一點時間來搜索一下Linux下常見的調試工具,這不搜不知道,一搜嚇一跳,居然差點錯過了這麼好的調試利器GDB。上手十分簡單,幾分鐘就可以開開心心調試你的代碼了。
GDB是一個由GNU開源組織發布的、UNIX/LINUX操作系統下的、基於命令行的、功能強大的程序調試工具。相比於VS裡面的圖形化調試工具,其功能更加強大。
在終端下運行如下代碼即可安裝GDB調試器:
sudo apt-get install gdb
檢查安裝是否成功,輸入gdb -version,會輸出如下代碼:
GNU gdb (Ubuntu 7.10-1ubuntu2) 7.10
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
寫了一個簡單實現兩個數相加的程序,來示范gdb調試的相關步驟:
#include <stdio.h>
int add(int a , int b){
return a+b;
}
int main(){
int m,n;
scanf("%d%d",&m,&n);
int sum = add(m , n);
return 0;
}
一般在編譯程序的時候都是直接生成release可執行文件,
gcc -o add add.c
如果需要調試的話,應該編譯成debug版本,此時,只用在編譯選項中加入 -g,如下:
gcc -g add.c -o add
進入gdb調試狀態有兩種,第一種直接在gdb命令後面加上編譯好的文件名:
gdb add
另一種方式就是輸入gdb,然後通過使用file命令來打開待調試的文件:
gdb
file add
終端界面會顯示如下信息:
GNU gdb (Ubuntu 7.10-1ubuntu2) 7.10
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from add...done.
(gdb)
(gdb) l
1 #include <stdio.h>
2
3 int add(int a , int b){
4 return a+b;
5 }
6 int main(){
7 int m,n;
8 scanf("%d%d",&m,&n);
9 int sum = add(m , n);
10 return 0;
在main函數和程序的第4行加兩個斷點。
(gdb) break main
Breakpoint 1 at 0x4005e2: file add.c, line 6.
(gdb) break 4
Breakpoint 2 at 0x4005d0: file add.c, line 4.
(gdb) run
Starting program: /home/Documents/add
Breakpoint 1, main () at add.c:6
6 int main(){ //這裡顯示運行到的位置,停在了第一個斷點位置main
(gdb) n
8 scanf("%d%d",&m,&n); //下一行
(gdb) n //下一行需要輸入兩個數字
5 4
9 int sum = add(m , n); //執行到add函數位置
(gdb) s
Breakpoint 2, add (a=5, b=4) at add.c:4 //單步調試恰好到達第二個斷點的位置
4 return a+b;
(gdb) p a // 打印a的值
$1 = 5
(gdb) p b //打印b的值
$2 = 4
清楚指定行的斷點,不加表示清除所有的斷點
(gdb) break 9
Breakpoint 5 at 0x40060b: file add.c, line 9. //加一個斷點
(gdb) cl 9
Deleted breakpoint 5 //測試清除
(gdb) c
Continuing.
[Inferior 1 (process 8168) exited normally] //程序正常退出,調試完畢
gdb還有很多高級用法,如查看堆棧列表,分割窗口等,這裡就不一一測試了。
學習gdb調試只需要幾分鐘就能上手,但是用處超級大!!受益匪淺啊!這就是所謂的低投入高回報,還在等什麼,趕緊行動吧。
GDB調試程序用法 http://www.linuxidc.com/Linux/2013-06/86044.htm
GDB+GDBserver無源碼調試Android 動態鏈接庫的技巧 http://www.linuxidc.com/Linux/2013-06/85936.htm
使用hello-gl2建立ndk-GDB環境(有源碼和無源碼調試環境) http://www.linuxidc.com/Linux/2013-06/85935.htm
在Ubuntu上用GDB調試printf源碼 http://www.linuxidc.com/Linux/2013-03/80346.htm
Linux下用GDB調試可加載模塊 http://www.linuxidc.com/Linux/2013-01/77969.htm
Ubuntu下使用GDB斷點Go程序 http://www.linuxidc.com/Linux/2012-06/62941.htm
使用GDB命令行調試器調試C/C++程序 http://www.linuxidc.com/Linux/2014-11/109845.htm
GDB調試命令總結 http://www.linuxidc.com/Linux/2016-08/133988.htm
GDB 的詳細介紹:請點這裡
GDB 的下載地址:請點這裡