Linux C編程學習之開發工具2---GDB調試器

簡介sass

  GDB是一個功能強大的交互式程序調試工具,主要工做在字符界面下。函數

  GDB不只能夠用來調試C/C++ 語言編寫的程序,還能夠用來調試 Pascal、Objective-C,以及Fortran等語言編寫的程序工具

 

GDB經常使用命令優化

  GDB 調試器有不少命令,從簡單的文件載入、斷點設置到複雜的內存查看、信號捕捉等。spa

  在使用GDB 調試程序以前,必須使用 -g 選項用gcc(或者g++)編譯源文件,以便將調試信息加入到要調試的程序之中,並且 gcc 的 -個選項不能和優化選項一塊兒使用命令行

  GDB的基本命令包括GDB的啓動與退出、載入程序、列出源代碼、執行程序以及使用幫助功能等調試

1.GDB的啓動與退出blog

  直接在命令行輸入gdb 就會進入gdb 的交互模式內存

  在gdb的交互模式,使用 q 命令會退出 gdb作用域

2.載入程序

  方式1:直接使用命令: gdb 可執行文件,例子:gdb test

  方式2:使用 gdb 先進入gdb 的交互模式,而後在gdb 交互模式下使用 file 可執行文件(例子:file test)將要調試的可執行文件載入

3.列出源代碼

  在載入程序以後,使用 list(或者使用簡寫形式 l)就會列出前十行代碼

  再輸入 l(或list),就會列出緊接着的後十行代碼

  l 3,5:列出第三到第五行的代碼

  l 9:列出第九行以及它的上下五行代碼

4.執行程序

  使用r(或者run)來直接運行載入的程序,若是程序中沒有設置斷點,那麼將一直執行程序;若是程序中存在斷點,那麼將會執行到第一個斷點所在的地方,而後停住

5.使用幫助功能

  能夠在gdb 的交互模式下使用 help 命令列出命令的種類(好比 running、stack、status……)

  若是在 help 後面加上某個種類的名稱,那麼將會列出這個種類下的全部的命令信息,好比 help running 將給出全部關於程序運行的命令

  能夠直接在help 後跟命令的名稱,獲取這條命令的介紹,好比 help run 將獲取關於 run 的詳細介紹

 

斷點設置與管理

  斷點設置即在調試的程序中設置斷點,斷點的管理包括查看斷點信息、刪除或禁用斷點等

1.設置斷點(break)

  命令是break,或者簡寫爲 b

  b 8:在第8行設置斷點,若是這個使用再用 r 運行程序,會發現程序會在第 8 行暫停

    若是想要繼續運行,可使用 continue(或者c)繼續執行,也會在遇到斷點時暫停

  b 函數名:是程序在遇到指定的函數時候暫停執行

  b 8 if i>7:在第8行設置斷點,而且只有在當第8行的 i>7 爲真時纔會暫停

2.查看斷點信息(info break)

  info break:顯示當前gdb 在調試程序中設置的全部斷點信息

3.刪除指定的斷點(d)

  d 斷點號:或者是使用delete,指定斷點號的話將會刪除指定的那個斷點,若是不指定斷點號將會刪除全部斷點 

4.刪除指定行上的斷點(clear)

  clear 行號(或者一個範圍):刪除指定行上的斷點

5.禁用指定的斷點(disable)

  disable 斷點號:暫時禁止指定的斷點號,若是不指定斷點號將會禁止全部斷點

6.恢復指定的斷點(enable)

  enable 斷點號:使得用 disable禁止的斷點再次有效

7.設置觀察點(watch)

  在程序的調試過程當中,常常須要定位某個變量被改動的位置。

  使用觀察點用來檢測某個變量或者表達式的值是否有變化,若是有變化則暫停程序的運行

  watch 變量名(或者表達式的名稱):watch設置觀察點必須是在程序的運行過程當中設置的,也就是在運行run 命令以後進行設置

 

數據顯示與變量賦值

  上面介紹斷點的應用,可是若是隻有斷點是用處不大的,要跟蹤程序的運行,必須可以在斷點處查看或修改變量的值

  下面的介紹是以這個源碼爲例的(test.c)

#include<stdio.h>
int main()
{
    int i;
    int sum = 0;
    for(i=1; i<=10; i++)
    {
        sum += i;
    }
    printf("1+2+...+10=%d\n", sum);
    return 0;
}

1.顯示變量或表達式的值(print或者p)

  1.編譯程序(必定要使用 -g 選項):gcc -g -o test test.c

  2.使用 gdb test 載入要調試的文件(下面的命令都是在 gdb的交互模式下執行的)

  3.b 8,在第八行設置斷點

  4.r,運行程序,在第八行暫停

  5.p sum,顯示此時 sum的值,此時sum的值爲0

    或者使用 p/x sum,使用 16進制形式輸出 sum的值

  6.使用 c 命令繼續執行,第二次循環又在 第8行暫停

  7.p sum,顯示此時上的sum 值爲 1(...依次循環)

  p 以後的變量必須是全局變量,或者是在這個做用域有效的局部變量,若是全局變量和局部變量重名,那麼局部變量會隱藏全局變量,若是此時像查看 全局變量的值,使用 :: 操做符

2.自動顯示變量或表達式的值(display)

  使用該命令以後,每當程序運行到斷點處,就會自動顯示以前設置過得變量或表達式

  一、二、三、4同上,此時暫停執行

  5.display sum:設置自動顯示sum

  6.c :繼續執行,而且自動在第二次循環執行到第8行時又暫停,此時會自動顯示 sum 的值,而不用再去使用 p sum 了  

3.顯示變量的數據類型(whatis、ptype)

  一、二、三、4同上,此時暫停執行

  5.使用 whatis sum,或者 ptype sum,將會顯示:type = int,就是sum的數據類型的 int

4.修改變量的值(set)

  一、二、三、4同上,此時暫停執行

  5.set sum=100,設置此時的sum 爲100,而後下面的運行就會在sum=100基礎上執行

  6.,繼續執行,而且自動在第二次循環執行到第8行時又暫停,用 p sum,能夠看到sum的值爲101(第一次循環是sum+=i; i爲1)

  7.,繼續執行,而且自動在第二次循環執行到第8行時又暫停,用 p sum,能夠看到sum的值爲103(第一次循環是sum+=i; i爲2)

 

程序執行與函數調用

  上面已經介紹了 run和continue,下面介紹其餘的

1.單步執行(step、next)

  step能夠簡寫爲s;next能夠簡寫爲 n

  step:執行到函數調用的地方,會跟蹤進入函數內部(而且會給出提示信息:被調用函數的入口地址、行號……)

  next:執行到函數調用的地方,並不會跟蹤進入函數內部,而是直接將函數調用看作是一個語句,直接執行過去

2.退出被調用的函數(return)

   step 能夠跟蹤進入被調用函數的內部,可是若是想要退出被調用函數,則可使用 return 命令

3.執行到指定行(until 行號)

   使用until 的前提是從當前行到指定行之間沒有斷點,不然會在第一個斷點處暫停

4.跳轉執行(jump)

   通常狀況下,程序會按照程序代碼的順序執行,可是若是想要更改程序的運行順序,可使用 jump

5.強制調用函數(call)

 

其餘調試命令

1.查看堆棧信息(backtrace、frame)

 

2.查看源程序信息(info source)

 

3.查看寄存器(info registers)

 

4.查看程序的彙編代碼(disassemble)

相關文章
相關標籤/搜索