新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > Linux下C編程基礎(chǔ)之:gdb調(diào)試器

        Linux下C編程基礎(chǔ)之:gdb調(diào)試器

        作者: 時(shí)間:2013-09-13 來源:網(wǎng)絡(luò) 收藏

        本文引用地址:http://www.104case.com/article/257150.htm

        (2)設(shè)置斷點(diǎn)。

        設(shè)置斷點(diǎn)是調(diào)試程序中一個(gè)非常重要的手段,它可以使程序運(yùn)行到一定位置時(shí)暫停。因此,程序員在該位置處可以方便地查看變量的值、堆棧情況等,從而找出代碼的癥結(jié)所在。

        在gdb中設(shè)置斷點(diǎn)非常簡單,只需在“b”后加入對應(yīng)的行號(hào)即可(這是最常用的方式,另外還有其他方式設(shè)置斷點(diǎn)),如下所示:

        (gdb)b6

        Breakpoint1at0x804846d:filetest.c,line6.

        要注意的是,在gdb中利用行號(hào)設(shè)置斷點(diǎn)是指代碼運(yùn)行到對應(yīng)行之前將其停止,如上例中,代碼運(yùn)行到第6行之前暫停(并沒有運(yùn)行第6行)。

        (3)查看斷點(diǎn)情況。

        在設(shè)置完斷點(diǎn)之后,用戶可以鍵入“infob”來查看設(shè)置斷點(diǎn)情況,在gdb中可以設(shè)置多個(gè)斷點(diǎn)。

        (gdb)infob

        NumTypeDispEnbAddressWhat

        1breakpointkeepy0x0804846dinmainattest.c:6

        用戶在斷點(diǎn)鍵入“backrace”(只輸入“bt”即可)可以查到調(diào)用函數(shù)(堆棧)的情況,這個(gè)功能在程序調(diào)試之中使用非常廣泛,經(jīng)常用于排除錯(cuò)誤或者監(jiān)視調(diào)用堆棧的情況。

        (gdb)b19

        (gdb)c

        Breakpoin2,sum(m=50)attest.c:19

        19printf(“Thesumof1-mis%dn”,n);

        (gdb)bt

        #0sum(m=50)attest.c:19 /*停在test.c的sum()函數(shù),第19行*/

        #10x080483e8inmain()attest.c:6/*test.c的第6行調(diào)用sum函數(shù)*/

        (4)運(yùn)行代碼。

        接下來就可運(yùn)行代碼了,gdb默認(rèn)從首行開始運(yùn)行代碼,鍵入“r”(run)即可(若想從程序中指定行開始運(yùn)行,可在r后面加上行號(hào))。

        (gdb)r

        Startingprogram:/root/workplace/gdb/test

        Readingsymbolsfromsharedobjectreadfromtargetmemory...done.

        LoadedsystemsuppliedDSOat0x5fb000

        Breakpoint1,main()attest.c:6

        6sum(50);

        可以看到,程序運(yùn)行到斷點(diǎn)處就停止了。

        (5)查看變量值。

        在程序停止運(yùn)行之后,程序員所要做的工作是查看斷點(diǎn)處的相關(guān)變量值。在gdb中鍵入“p”+變量值即可,如下所示:

        (gdb)pn

        $1=0

        (gdb)pi

        $2=134518440

        在此處,為什么變量“i”的值為如此奇怪的一個(gè)數(shù)字呢?原因就在于程序是在斷點(diǎn)設(shè)置的對應(yīng)行之前停止的,那么在此時(shí),并沒有把“i”的數(shù)值賦為零,而只是一個(gè)隨機(jī)的數(shù)字。但變量“n”是在第4行賦值的,故在此時(shí)已經(jīng)為零。

        小技巧

        gdb在顯示變量值時(shí)都會(huì)在對應(yīng)值之前加上“$N”標(biāo)記,它是當(dāng)前變量值的引用標(biāo)記,所以以后若想再次引用此變量就可以直接寫作“$N”,而無需寫冗長的變量名。

        (6)單步運(yùn)行。

        單步運(yùn)行可以使用命令“n”(next)或“s”(step),它們之間的區(qū)別在于:若有函數(shù)調(diào)用的時(shí)候,“s”會(huì)進(jìn)入該函數(shù)而“n”不會(huì)進(jìn)入該函數(shù)。因此,“s”就類似于Uisual等工具中的“stepin”,“n”類似與Uisual等工具中的“stepover”。它們的使用如下所示:

        (gdb)n

        Thesumof1-mis1275

        7for(i=1;i=50;i++)

        (gdb)s

        sum(m=50)attest.c:16

        16inti,n=0;

        可見,使用“n”后,程序顯示函數(shù)sum()的運(yùn)行結(jié)果并向下執(zhí)行,而使用“s”后則進(jìn)入sum()函數(shù)之中單步運(yùn)行。

        (7)恢復(fù)程序運(yùn)行

        在查看完所需變量及堆棧情況后,就可以使用命令“c”(continue)恢復(fù)程序的正常運(yùn)行了。這時(shí),它會(huì)把剩余還未執(zhí)行的程序執(zhí)行完,并顯示剩余程序中的執(zhí)行結(jié)果。以下是之前使用“n”命令恢復(fù)后的執(zhí)行結(jié)果:

        (gdb)c

        Continuing.

        Thesumof1-50is:1275

        Programexitedwithcode031.

        可以看出,程序在運(yùn)行完后退出,之后程序處于“停止?fàn)顟B(tài)”。

        小知識(shí)

        在gdb中,程序的運(yùn)行狀態(tài)有“運(yùn)行”、“暫停”和“停止”3種,其中“暫停”狀態(tài)為程序遇到了斷點(diǎn)或觀察點(diǎn)之類的,程序暫時(shí)停止運(yùn)行,而此時(shí)函數(shù)的地址、函數(shù)參數(shù)、函數(shù)內(nèi)的局部變量都會(huì)被壓入“棧”(Stack)中。故在這種狀態(tài)下可以查看函數(shù)的變量值等各種屬性。但在函數(shù)處于“停止”狀態(tài)之后,“棧”就會(huì)自動(dòng)撤消,它也就無法查看各種信息了。

        linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

        linux相關(guān)文章:linux教程




        評(píng)論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 娱乐| 沂源县| 永登县| 小金县| 泗洪县| 奉新县| 长乐市| 仙游县| 江西省| 洛川县| 卫辉市| 武强县| 介休市| 榆中县| 阿城市| 个旧市| 北海市| 阿荣旗| 鄂州市| 辛集市| 涡阳县| 类乌齐县| 孙吴县| 甘德县| 梁山县| 清镇市| 五河县| 湖口县| 赤水市| 仁布县| 永济市| 霸州市| 阜宁县| 通榆县| 鹤岗市| 蛟河市| 综艺| 谢通门县| 左贡县| 金乡县| 苏州市|