如何使用gdb來調(diào)試一個應(yīng)用?(譯)

用C來開發(fā)一個應(yīng)用,我們不可避免會產(chǎn)生一些錯誤.有些錯誤,編譯時,編譯器便會提示我們.而有些運行時的錯誤,由于在運行時才會出現(xiàn),很難診斷.比如常見的Segment Fault錯誤.我現(xiàn)在在開發(fā)一個HTTP服務(wù)器時,最常見的就是這個錯誤.通常來說,只會給你上面那么一個錯誤提示.這樣的話,我們往往不明所以.但是,有了gdb,這一切都So easy.

這篇文章,便初步介紹了如何使用gdb來調(diào)試一個應(yīng)用.但是,gdb本身也是一個很復(fù)雜的工具,所以,我們還需要查詢其他的資料,來了解并掌握gdb的使用方法.

在這篇文章中,我們將分六步,來介紹gdb的使用.

寫一個調(diào)試用的C程序

我們寫了一個用于求階乘的程序.但是,這個程序中含有一些錯誤.我們將在后面調(diào)試這些錯誤.

-g選項編譯這個C程序

-g選項表明允許編譯器來收集調(diào)試信息.

上面的命令會創(chuàng)建一個用于調(diào)試的C程序.

用gdb加載這個應(yīng)用程序

使用下面的命令來加載一個應(yīng)用.

設(shè)置斷點

設(shè)置斷點還有其他的格式:

  • break [file_name]:line_number
  • break [file_name]:func_name

將斷點設(shè)置在你要調(diào)試的地方.當(dāng)程序執(zhí)行到這個地方,就會自動停止,并輸出一些能夠幫助你進行調(diào)試的信息.

在啟動要調(diào)試的程序之前,我們先設(shè)置斷點:

在gdb中啟動要調(diào)試的程序

我們可以在gdb中通過run命令,來啟動被調(diào)試的程序.我們也可以設(shè)置參數(shù),但是因為我們的程序不需要傳入?yún)?shù),所以這里我們沒有設(shè)置.

程序會自動運行到斷點,然后停止,然后輸出調(diào)試信息:

打印變量的值

從上圖中可以看到,因為我們沒有為j這個變量賦初值,所以它獲得了一個隨機值.

我們?yōu)?strong>j賦初值1.然后重新編譯程序.

你可以看到,即使我們修復(fù)了程序中的錯誤,執(zhí)行起來仍然有錯誤.

我們先在第十行設(shè)置斷點,然后執(zhí)行后面的操作.

Continue, stepping over and in – gdb commands

當(dāng)程序停在斷點處時,我們可以執(zhí)行下面三條命令中的一條:

  • continue: 執(zhí)行到下一個斷點處
  • next: 執(zhí)行下一條語句
  • step:和next類似,但是不會跳過函數(shù).即如果下一條語句中,包含一個函數(shù),則會進入到這個函數(shù)內(nèi)部.

通過執(zhí)行continue或者step,我們可以發(fā)現(xiàn)程序還有問題是因為我們的循環(huán)終止的條件不正確.把<修改成>即可.

gdb命令縮寫

下面幾個是我們最常用的命令,及他們的縮寫:

  • list的縮寫是其首字母l
  • print的縮寫是其首字母p
  • continue的縮寫是其首字母c
  • step的縮寫是其首字母s
  • 執(zhí)行ENTER,會再次執(zhí)行上面執(zhí)行的最后一條命令

其他gdb命令

  • list命令: 這條命令用于打印源代碼,我們可以通過加上行數(shù)這個參數(shù)來查看指定的一行,或者加上函數(shù)名這個參數(shù)來查看指定的函數(shù).
  • backtrack命令: 打印棧.
  • help命令: 查看都有什么命令,以及命令的具體用法.
  • quit: 退出gdb調(diào)試器

原文鏈接

http://www.thegeekstuff.com/2010/03/debug-c-program-using-gdb

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容