用C來開發(fā)一個應用,我們不可避免會產生一些錯誤.有些錯誤,編譯時,編譯器便會提示我們.而有些運行時的錯誤,由于在運行時才會出現,很難診斷.比如常見的Segment Fault錯誤.我現在在開發(fā)一個HTTP服務器時,最常見的就是這個錯誤.通常來說,只會給你上面那么一個錯誤提示.這樣的話,我們往往不明所以.但是,有了gdb,這一切都So easy.
這篇文章,便初步介紹了如何使用gdb來調試一個應用.但是,gdb本身也是一個很復雜的工具,所以,我們還需要查詢其他的資料,來了解并掌握gdb的使用方法.
在這篇文章中,我們將分六步,來介紹gdb的使用.
寫一個調試用的C程序
我們寫了一個用于求階乘的程序.但是,這個程序中含有一些錯誤.我們將在后面調試這些錯誤.
用-g選項編譯這個C程序
-g選項表明允許編譯器來收集調試信息.
上面的命令會創(chuàng)建一個用于調試的C程序.
用gdb加載這個應用程序
使用下面的命令來加載一個應用.
設置斷點
設置斷點還有其他的格式:
- break [file_name]:line_number
- break [file_name]:func_name
將斷點設置在你要調試的地方.當程序執(zhí)行到這個地方,就會自動停止,并輸出一些能夠幫助你進行調試的信息.
在啟動要調試的程序之前,我們先設置斷點:
在gdb中啟動要調試的程序
我們可以在gdb中通過run命令,來啟動被調試的程序.我們也可以設置參數,但是因為我們的程序不需要傳入參數,所以這里我們沒有設置.
程序會自動運行到斷點,然后停止,然后輸出調試信息:
打印變量的值
從上圖中可以看到,因為我們沒有為j這個變量賦初值,所以它獲得了一個隨機值.
我們?yōu)?strong>j賦初值1.然后重新編譯程序.
你可以看到,即使我們修復了程序中的錯誤,執(zhí)行起來仍然有錯誤.
我們先在第十行設置斷點,然后執(zhí)行后面的操作.
Continue, stepping over and in – gdb commands
當程序停在斷點處時,我們可以執(zhí)行下面三條命令中的一條:
- continue: 執(zhí)行到下一個斷點處
- next: 執(zhí)行下一條語句
- step:和next類似,但是不會跳過函數.即如果下一條語句中,包含一個函數,則會進入到這個函數內部.
通過執(zhí)行continue或者step,我們可以發(fā)現程序還有問題是因為我們的循環(huán)終止的條件不正確.把<修改成>即可.
gdb命令縮寫
下面幾個是我們最常用的命令,及他們的縮寫:
- list的縮寫是其首字母l
- print的縮寫是其首字母p
- continue的縮寫是其首字母c
- step的縮寫是其首字母s
- 執(zhí)行ENTER,會再次執(zhí)行上面執(zhí)行的最后一條命令
其他gdb命令
- list命令: 這條命令用于打印源代碼,我們可以通過加上行數這個參數來查看指定的一行,或者加上函數名這個參數來查看指定的函數.
- backtrack命令: 打印棧.
- help命令: 查看都有什么命令,以及命令的具體用法.
- quit: 退出gdb調試器
原文鏈接
http://www.thegeekstuff.com/2010/03/debug-c-program-using-gdb