本文導航
沒有調試器的情況下編寫程式時最糟糕的狀況是什麼?編譯時跪着祈禱不要出錯?用血祭召喚惡魔幫你運作程式?或者在每一行代碼間添加printf("test")語句來定位錯誤點?如你所知,編寫程式時不使用調試器的話是不友善的。幸好,linux下調試還是很友善的。大多數人使用的IDE都內建了調試器,但 linux 最著名的調試器是指令行形式的C/C++調試器GDB。然而,與其他指令行工具一緻,DGB需要一定的練習才能完全掌握。這裡,我會告訴你GDB的基本情況及使用方法。

<a target="_blank"></a>
大多數的發行版倉庫中都有GDB
Debian 或 Ubuntu
$ sudo apt-get install gdb
Arch Linux
$ sudo pacman -S gdb
Fedora,CentOS 或 RHEL:
$sudo yum install gdb
當學習GDB時,最好有一份代碼,動手試驗。下列代碼是我編寫的簡單例子,它可以很好的展現GDB的特性。将它拷貝下來并且進行實驗——這是最好的方法。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
int i;
int a=0, b=0, c=0;
double d;
for (i=0; i<100; i++)
a++;
if (i>97)
d = i / 2.0;
b++;
}
return 0;
首先最重要的,你需要使用編譯器的 “-g“選項來編譯程式,這樣可執行程式才能通過GDB來運作。通過下列語句開始調試:
$ gdb -tui [可執行程式名]
使用”-tui“選項可以将代碼顯示在一個漂亮的互動式視窗内(是以被稱為“文本使用者界面 TUI”),在這個視窗内可以使用光标來操控,同時在下面的GDB shell中輸入指令。
現在我們可以在程式的任何地方設定斷點。你可以通過下列指令來為目前源檔案的某一行設定斷點。
break [行号]
或者為一個特定的函數設定斷點:
break [函數名]
甚至可以設定條件斷點
break [行号] if [條件]
例如,在我們的示例代碼中,可以設定如下:
break 11 if i > 97
這樣,程式循環97次之後停留在“a++”語句上。這樣是非常友善的,避免了我們需要手動循環97次。
最後但也是很重要的是,我們可以設定一個“觀察斷點”,當這個被觀察的變量發生變化時,程式會被停止。
watch [變量]
這裡我們可以設定如下:
watch d
當d的值發生變化時程式會停止運作(例如,當i>97為真時)。
當設定斷點後,使用"run"指令開始運作程式,或按如下所示:
r [程式的輸入參數(如果有的話)]
gdb中,大多數的指令單詞都可以簡寫為一個字母。
不出意外,程式會停留在11行。這裡,我們可以做些有趣的事情。下列指令:
bt
回溯功能(backtrace)可以讓我們知道程式如何到達這條語句的。
info locals
這條語句會顯示所有的局部變量以及它們的值(你可以看到,我沒有為d設定初始值,是以它現在的值是任意值)。
當然:
p [變量]
這個指令可以顯示特定變量的值,而更進一步:
ptype [變量]
可以顯示變量的類型。是以這裡可以确定d是double型。
既然已經到這一步了,我麼不妨這麼做:
set var [變量] = [新的值]
這樣會覆寫變量的值。不過需要注意,你不能建立一個新的變量或改變變量的類型。我們可以這樣做:
set var a = 0
如其他優秀的調試器一樣,我們可以單步調試:
step
使用如上指令,運作到下一條語句,有可能進入到一個函數裡面。或者使用:
next
這可以直接運作下一條語句,而不進入子函數内部。
結束測試後,删除斷點:
delete [行号]
從目前斷點繼續運作程式:
continue
退出GDB:
quit
你對GDB有什麼看法?你會将它與圖形調試器對比嗎,它有什麼優勢呢?對于将GDB內建到Vim有什麼看法呢?将你的想法寫到評論裡。
本文轉自張昺華-sky部落格園部落格,原文連結:http://www.cnblogs.com/sky-heaven/p/7613179.html,如需轉載請自行聯系原作者