歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> GDB調試工具入門

GDB調試工具入門

日期:2017/3/1 9:12:08   编辑:Linux編程

從Windows轉到Linux下已經有一段時間了,每次刷算法題碰到問題需要調試的時候,就分分鐘想關機,切換到Windows上調試。於是,花了一點時間來搜索一下Linux下常見的調試工具,這不搜不知道,一搜嚇一跳,居然差點錯過了這麼好的調試利器GDB。上手十分簡單,幾分鐘就可以開開心心調試你的代碼了。

GDB概述

GDB是一個由GNU開源組織發布的、UNIX/LINUX操作系統下的、基於命令行的、功能強大的程序調試工具。相比於VS裡面的圖形化調試工具,其功能更加強大。

GDB安裝

在終端下運行如下代碼即可安裝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調試步驟

調試用例

寫了一個簡單實現兩個數相加的程序,來示范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) 

常用調試命令

常用命令簡寫命令用法說明 file f file filename 在gdb中載入某可執行文件 list l list [開始,結束] 列出文件的代碼清單,支持指定行號 print p p 變量名 答應出變量的值 break b break 行號or函數名 在指定行號或函數上設置斷點 clear cl clear 行號or函數名 刪除指定行號或函數上的斷點 continue c continue [開始,結束] 從斷點處繼續運行 next n next 運行到下一行 step s step 單步調試 run r run 執行程序

實際調試

列出代碼清單

(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

next下一行

(gdb) n
8       scanf("%d%d",&m,&n);  //下一行
(gdb) n                       //下一行需要輸入兩個數字
5 4
9       int sum = add(m , n); //執行到add函數位置

step單步

(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還有很多高級用法,如查看堆棧列表,分割窗口等,這裡就不一一測試了。

查詢運行信息

  • where/bt:查看當前運行的堆棧列表
  • up/down:改變堆棧顯示的深度
  • set args:參數:指定運行時的參數
  • show args:查看設置好的參數
  • info program: 來查看程序的是否在運行,進程號,被暫停的原因。

分割窗口

  • layout:用於分割窗口,可以一邊查看代碼,一邊測試
  • layout src:顯示源代碼窗口
  • layout asm:顯示反匯編窗口
  • layout regs:顯示源代碼/反匯編和CPU寄存器窗口
  • layout split:顯示源代碼和反匯編窗口
  • Ctrl + L:刷新窗口

後記

學習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 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved