<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

          作者: 時間:2013-09-13 來源:網絡 收藏

          本文引用地址:http://www.ex-cimer.com/article/257150.htm

          (2)設置斷點。

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

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

          (gdb)b6

          Breakpoint1at0x804846d:filetest.c,line6.

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

          (3)查看斷點情況。

          在設置完斷點之后,用戶可以鍵入“infob”來查看設置斷點情況,在gdb中可以設置多個斷點。

          (gdb)infob

          NumTypeDispEnbAddressWhat

          1breakpointkeepy0x0804846dinmainattest.c:6

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

          (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行調用sum函數(shù)*/

          (4)運行代碼。

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

          (gdb)r

          Startingprogram:/root/workplace/gdb/test

          Readingsymbolsfromsharedobjectreadfromtargetmemory...done.

          LoadedsystemsuppliedDSOat0x5fb000

          Breakpoint1,main()attest.c:6

          6sum(50);

          可以看到,程序運行到斷點處就停止了。

          (5)查看變量值。

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

          (gdb)pn

          $1=0

          (gdb)pi

          $2=134518440

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

          小技巧

          gdb在顯示變量值時都會在對應值之前加上“$N”標記,它是當前變量值的引用標記,所以以后若想再次引用此變量就可以直接寫作“$N”,而無需寫冗長的變量名。

          (6)單步運行。

          單步運行可以使用命令“n”(next)或“s”(step),它們之間的區(qū)別在于:若有函數(shù)調用的時候,“s”會進入該函數(shù)而“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()的運行結果并向下執(zhí)行,而使用“s”后則進入sum()函數(shù)之中單步運行。

          (7)恢復程序運行

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

          (gdb)c

          Continuing.

          Thesumof1-50is:1275

          Programexitedwithcode031.

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

          小知識

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

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

          linux相關文章:linux教程




          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();