gdb簡約入門

GDB是GNU開源組織發佈的一個強大的UNIX下的程序調試工具。或許,各位比較喜歡那種圖形界面方式的,像VC、BCB等IDE的調試,但若是你是在UNIX平臺下作軟件,你會發現GDB這個調試工具備比VC、BCB的圖形化調試器更強大的功能。所謂「寸有所長,尺有所短」就是這個道理。html

通常來講,GDB主要幫忙你完成下面四個方面的功能:linux

​ 一、啓動你的程序,能夠按照你的自定義的要求爲所欲爲的運行程序。
​ 二、可以讓被調試的程序在你所指定的調置的斷點處停住。(斷點能夠是條件表達式)
​ 三、當程序被停住時,能夠檢查此時你的程序中所發生的事。
​ 四、動態的改變你程序的執行環境。git

從上面看來,GDB和通常的調試工具沒有什麼兩樣,基本上也是完成這些功能,不過在細節上,你會發現GDB這個調試工具的強大,你們可能比較習慣了圖形化的調試工具,但有時候,命令行的調試工具卻有着圖形化工具所不能完成的功能。讓咱們一一看來。redis

先用vim寫一個示例程序(tst.c):shell

#include <stdio.h>
 
int func(int n)
{
    int sum=0, i;
    for(i=0;i<n;i++)
    {
        sum+=i;
    }
    return sum;
}
 
void main()
{
    int i;
    long result=0;
    for(i=1;i<=100;i++)
    {
        result+=i;
    }
    printf("result[1-100]=%d \n", result);
    printf("result[1-250]=%d \n", func(250));
}

編譯生成可執行文件:ubuntu

$ gcc -g tst.c -o tst # -g 選項的意思是加入調試信息

使用gdb調試(感性理解):vim

(體驗好差,能夠來這裏看:https://blog.csdn.net/HaoZiHu... )markdown

$ gdb tst                 <----------啓動GDB

 
GNU gdb (Ubuntu 8.1-0ubuntu3) 8.1.0.20180409-git       <-------顯示GDB說明,無論它
Copyright (C) 2018 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 tst...done.


(gdb) l                  <-----------l命令至關於list,從第一行開始列出源碼
2    
3    int func(int n)
4    {
5        int sum=0, i;
6        for(i=0;i<n;i++)
7        {
8            sum+=i;
9        }
10        return sum;
11    }


(gdb)                   <-------------- 直接回車,重複上一次命令
12    
13    void main()
14    {
15        int i;
16        int result=0;
17        for(i=1;i<=100;i++)
18        {
19            result+=i;
20        }
21        printf("result[1-100]=%d /n", result);


(gdb) break 15          <-------------- 設置斷點,在源程序第15行設置斷點
Breakpoint 1 at 0x680: file tst.c, line 15.


(gdb) break func        <-------------- 設置斷點,在函數func()入口處
Breakpoint 2 at 0x651: file tst.c, line 5.


(gdb) info break        <--------------- 查看斷點信息
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000000000000680 in main at tst.c:15
2       breakpoint     keep y   0x0000000000000651 in func at tst.c:5


(gdb) r                 <--------------- 運行程序,run命令簡寫
Starting program: /home/jack/demo/gdb/tst 

Breakpoint 1, main () at tst.c:16
16        int result=0;   <--------------- 在斷點處停住


(gdb) n                 <--------------- 單條語句執行,next命令簡寫
17        for(i=1;i<=100;i++)
(gdb) n
19            result+=i;
(gdb) n
17        for(i=1;i<=100;i++)
(gdb) n
19            result+=i;
(gdb) n
17        for(i=1;i<=100;i++)
(gdb) n
19            result+=i;


(gdb) c                 <--------------- 繼續運行命令,continue命令簡寫
Continuing.

Breakpoint 2, func (n=250) at tst.c:5
5        int sum=0, i;


(gdb) n
6        for(i=0;i<n;i++)
(gdb) n
8            sum+=i;


(gdb) p i              <--------------- 打印變量的值 print命令縮寫
$1 = 0
(gdb) p sum
$2 = 0


(gdb) bt               <--------------- 查看函數堆棧
#0  func (n=250) at tst.c:8
#1  0x00005555555546c0 in main () at tst.c:22


(gdb) finish           <---------------- 退出函數
Run till exit from #0  func (n=250) at tst.c:8
0x00005555555546c0 in main () at tst.c:22
22        printf("result[1-250]=%d /n", func(250));
Value returned is $3 = 31125

(gdb) c
Continuing.
result[1-100]=5050 
result[1-250]=31125 
[Inferior 1 (process 7775) exited with code 026] <-------------- 程序退出,調試結束


(gdb) q               <--------------- 退出gdb

在此處咱們簡單總結一下gdb的命令(<br/>是換行的意思,SF的markdown沒有內嵌這個元素......):函數

命令 解釋 實例
file <文件名> 加載被調試的可執行程序文件 (gdb) file gdb_sample
r run的簡寫,運行被調試的程序<br/>若是此前沒有設置過斷點,則完整執行整個程序<br/>若是有斷點,則程序暫停在第一個可用斷點處 (gdb) r
c continue的簡寫,繼續執行被調試過的程序,<br/>直至下一個斷點停在第一個可用斷點處 (gdb) c
b <行號><br/>b <函數名稱><br/>b <函數名稱><br/>b <代碼地址><br/>d [編號] b:break的簡寫,設置斷點,可使用行號、函數名稱<br/>或執行地址等方式來設置斷點位置<br/>其中在函數名稱前加*符號表示將斷點設置在"由編譯器<br/>生成的prolog"代碼處,若是不瞭解彙編,能夠無論此用法<br/>d:delete的簡寫,刪除指定編號的某個斷點,<br/>或刪除全部斷點,斷點編號從1開始遞增 (gdb) b 8<br/>(gdb) b main<br/>(gdb) b main<br/>(gdb) b 0x3422<br/>(gdb) d 1
s, n s:執行一行源程序代碼,若是此行代碼中函數調用,則進入該函數<br/>n:執行一行源程序代碼,此行代碼中的函數調用也一併執行<br/>s 至關於其餘調試器中的Step Into(單步跟蹤進入)<br/>n 至關於其餘調試器中的Step Over(單步跟蹤)<br/>這兩個命令必須在有源代碼調試信息的狀況下才可使用<br/>(GCC 編譯時使用-g參數) (gdb) s<br/>(gdb) n
si, ni si命令相似於s命令,ni命令相似於n命令,不一樣的是:<br/>這兩條命令所針對的是彙編指令<br/>而s/n針對的是源代碼 (gdb) si<br/>(gdb) ni
p <變量名稱> print的簡稱,顯示指定變量(臨時或全局變量)的值 (gdb) p i<br/>(gdb) p cardPlay
display ...<br/>undisplay <編號> display 設置程序中斷後欲顯示的數據及其格式<br/>例如,若是但願每次程序中斷後能夠看到即將被執行的下一條彙編指令,可使用命令"display /i $pc"<br/>其中 $pc表明當前彙編指令,/i表示以十六進行顯示,當須要關心彙編代碼時,此命令至關有用<br/>undisplay,取消先前的display設置,編號從1開始遞增 (gdb) display /i $pc<br/>(gdb) undisplay 1
i info的簡寫,顯示各種信息 (gdb) i r<br/>(gdb) i b<br/>(gdb) info break
q quit的簡寫,退出GDB調試環境 (gdb) q
help [命令名稱] GDB幫助命令,提供對GDB名種命令的解釋說明。<br/>若是指定了「命令名稱」參數,則顯示該命令的詳細說明;<br/>若是沒有指定參數,則分類顯示全部GDB命令,供用戶進一步瀏覽和查詢。 (gdb) help display
相關文章
相關標籤/搜索