内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

C編譯:使用gdb調(diào)試-創(chuàng)新互聯(lián)

介紹 gdb調(diào)試命令行使用

創(chuàng)新互聯(lián)建站服務(wù)項目包括禹城網(wǎng)站建設(shè)、禹城網(wǎng)站制作、禹城網(wǎng)頁制作以及禹城網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,禹城網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到禹城省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

gdb是the GNU Debugger的簡稱。它是一款UNIX平臺的調(diào)試器(debugger),可用于為C, C++, Objective-C, Java, Fortran等程序debug。

在gdb中,你可以通過設(shè)置斷點(break point)來控制程序運行的進(jìn)度,并查看斷點時的變量和函數(shù)調(diào)用狀況,從而發(fā)現(xiàn)可能的問題。在許多IDE中,gdb擁有圖形化界面。

這里主要介紹gdb的命令行使用,并以C程序為例。測試使用的計算機(jī)是Mac OS系統(tǒng)。

 
啟動gdb

下面的有兩個C文件。(并沒有bug。我們使用gdb來查看程序運行的細(xì)節(jié))

程序的一個為test.c,其中有主程序main()。mean.c程序中定義了mean()函數(shù),并在main()中調(diào)用。

test.c
復(fù)制代碼

#define ARRAYSIZE 4

float mean(float, float);

int main()
{
    int i;
    float a=4.5;
    float b=5.5;
    float rlt=0.0;

    float array_a[ARRAYSIZE]={1.0, 2.0, 3.0, 4.0};
    float array_b[ARRAYSIZE]={4.0, 3.0, 2.0, 1.0};
    float array_rlt[ARRAYSIZE];

    for(i = 0; i < ARRAYSIZE - 1; i++) {
        array_rlt[i] = mean(array_a[i], array_b[i]);
    }

    rlt = mean(a, b);

    return 0;
}

復(fù)制代碼

 

mean.c

float mean(float a, float b)
{
   return (a + b)/2.0;
}

 

使用gcc同時編譯上面兩個程序。為了使用gdb對進(jìn)行調(diào)試,必須使用-g選項(在編譯時生成debugging信息):

$gcc -g -o test test.c mean.c

生成main可執(zhí)行文件。

(如有必要,使用:

$chmod +x test

來增加用戶的執(zhí)行權(quán)限。)

 

進(jìn)入gdb,準(zhǔn)備調(diào)試程序:

$gdb test

進(jìn)入gdb的互動命令行。

 
顯示程序

我們可以直接顯示某一行的程序,比如查看第9行程序:

(gdb) list 9

將顯示以第9行為中心,總共10行的程序。我們實際上編譯了兩個文件,在沒有說明的情況下,默認(rèn)為主程序文件test.c:
復(fù)制代碼

4    
5    int main()
6    {
7        int i;
8        float a=4.5;
9        float b=5.5;
10        float rlt=0.0;
11    
12        float array_a[ARRAYSIZE]={1.0, 2.0, 3.0, 4.0};
13        float array_b[ARRAYSIZE]={4.0, 3.0, 2.0, 1.0};

復(fù)制代碼

 

如果要查看mean.c中的內(nèi)容,需要說明文件名:

(gdb) list mean.c:1

 

可以具體說明所要列出的程序行的范圍:

(gdb) list 5, 15

即顯示5-15行的程序。

 

顯示某個函數(shù),比如:

(gdb) list mean

 
設(shè)置斷點

我們可以運行程序:

(gdb) run

程序正常結(jié)束。

 

運行程序并沒有什么有趣的地方。gdb的主要功能在于能讓程序在中途暫停。

斷點(break point)是程序執(zhí)行中的一個位置。在gdb中,當(dāng)程序運行到該位置時,程序會暫停,我們可以查看此時的程序狀況,比如變量的值。

 

我們可以在程序的某一行設(shè)置斷點,比如:

(gdb) break 16

將在test.c的第16行設(shè)置斷點。

 

你可以查看自己設(shè)置的斷點:

(gdb) info break

每個斷點有一個識別序號。我們可以根據(jù)序號刪除某個斷點:

(gdb) delete 1

也可以刪除所有斷點:

(gdb) delete breakpoints

 
查看斷點

設(shè)置斷點,并使用run運行程序,程序?qū)⑦\行到16行時暫停。gdb顯示:

Breakpoint 1, main () at test.c:16
16        for(i = 0; i < ARRAYSIZE - 1; i++) {

 

查看斷點所在行:

(gdb) list

 

查看斷點處的某個變量值:

(gdb) print a

(gdb) print array_a

 

查看所有的局部變量:

(gdb) info local

 

查看此時的棧狀態(tài) (反映了函數(shù)調(diào)用,見Linux從程序到進(jìn)程):

(gdb) info stack

 

可以更改變量的值。

(gdb) set var a=0.0

(gdb) set var array_a={0.0, 0.0, 1.0, 1.0}

當(dāng)程序繼續(xù)運行時,將使用更改后的值。

 

如果我們將斷點設(shè)置在:

(gdb) break mean.c:2

此時棧中有兩個a,一個屬于main(),一個屬于mean()。我們可以用function::variable的方式區(qū)分:

(gdb) print mean::a

 
運行控制

讓程序從斷點開始,再多運行一行:

(gdb) step

也可以使用下面命令,從斷點恢復(fù)運行,直到下一個斷點:

(gdb) continue

使用run重新開始運行。

 
幫助

你可以通過gdb的幫助學(xué)到更多:

(gdb) help

或者更具體的命令:

(gdb) help info

 
退出

使用下面命令退出gdb:

(gdb) quit

 
debug

下面是一個有bug的C程序,demo.c
復(fù)制代碼

#include <stdio.h>

struct node {
    int element;
};

typedef struct node *PNode;

int main()
{
    int i;
    PNode np=NULL;

    for (i=0; i<10; i++) {
        printf("Hello World!");
    }

    printf("%d \n", np->element);
}

復(fù)制代碼

程序可以成功編譯,但運行將返回:

Segmentation fault

可以使用gdb來查找問題。

網(wǎng)站名稱:C編譯:使用gdb調(diào)試-創(chuàng)新互聯(lián)
分享鏈接:http://www.rwnh.cn/article36/dcehsg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器App開發(fā)、虛擬主機(jī)、網(wǎng)站改版、網(wǎng)站維護(hù)、自適應(yīng)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司
竹北市| 个旧市| 蓝田县| 崇义县| 阿克陶县| 庆安县| 吉林省| 吉木萨尔县| 金塔县| 汝阳县| 武夷山市| 高台县| 昭通市| 神池县| 尤溪县| 海林市| 揭西县| 个旧市| 南部县| 旌德县| 页游| 浑源县| 武邑县| 奎屯市| 泰宁县| 高阳县| 沂南县| 利辛县| 乌什县| 博湖县| 长兴县| 邛崃市| 林口县| 青海省| 堆龙德庆县| 宁海县| 图们市| 如皋市| 克拉玛依市| 佛冈县| 饶平县|