<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > Linux下C編程基礎之:gdb調試器

Linux下C編程基礎之:gdb調試器

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

本文引用地址:http://dyxdggzs.com/article/257150.htm

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

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

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

(gdb)b6

Breakpoint1at0x804846d:filetest.c,line6.

要注意的是,在gdb中利用行號設置斷點(diǎn)是指代碼運行到對應行之前將其停止,如上例中,代碼運行到第6行之前暫停(并沒(méi)有運行第6行)。

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

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

(gdb)infob

NumTypeDispEnbAddressWhat

1breakpointkeepy0x0804846dinmainattest.c:6

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

(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()函數,第19行*/

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

(4)運行代碼。

接下來(lái)就可運行代碼了,gdb默認從首行開(kāi)始運行代碼,鍵入“r”(run)即可(若想從程序中指定行開(kāi)始運行,可在r后面加上行號)。

(gdb)r

Startingprogram:/root/workplace/gdb/test

Readingsymbolsfromsharedobjectreadfromtargetmemory...done.

LoadedsystemsuppliedDSOat0x5fb000

Breakpoint1,main()attest.c:6

6sum(50);

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

(5)查看變量值。

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

(gdb)pn

$1=0

(gdb)pi

$2=134518440

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

小技巧

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

(6)單步運行。

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

(gdb)n

Thesumof1-mis1275

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

(gdb)s

sum(m=50)attest.c:16

16inti,n=0;

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

(7)恢復程序運行

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

(gdb)c

Continuing.

Thesumof1-50is:1275

Programexitedwithcode031.

可以看出,程序在運行完后退出,之后程序處于“停止狀態(tài)”。

小知識

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

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

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




關(guān)鍵詞: C編程 Linux gdb調試器 操作系統

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>