天天看點

使用GDB指令行調試器調試C/C++程式使用GDB指令行調試器調試C/C++程式

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

使用GDB指令行調試器調試C/C++程式使用GDB指令行調試器調試C/C++程式

<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 &lt;stdio.h&gt;

#include &lt;stdlib.h&gt;

int main(int argc, char **argv)

{

int i;

int a=0, b=0, c=0;

double d;

for (i=0; i&lt;100; i++)

a++;

if (i&gt;97)

d = i / 2.0;

b++;

}

return 0;

首先最重要的,你需要使用編譯器的 “-g“選項來編譯程式,這樣可執行程式才能通過gdb來運作。通過下列語句開始調試:

$ gdb -tui [可執行程式名]

使用”-tui“選項可以将代碼顯示在一個漂亮的互動式視窗内(是以被稱為“文本使用者界面 tui”),在這個視窗内可以使用光标來操控,同時在下面的gdb shell中輸入指令。

使用GDB指令行調試器調試C/C++程式使用GDB指令行調試器調試C/C++程式

現在我們可以在程式的任何地方設定斷點。你可以通過下列指令來為目前源檔案的某一行設定斷點。

break [行号]

或者為一個特定的函數設定斷點:

break [函數名]

甚至可以設定條件斷點

break [行号] if [條件]

例如,在我們的示例代碼中,可以設定如下:

break 11 if i &gt; 97

使用GDB指令行調試器調試C/C++程式使用GDB指令行調試器調試C/C++程式

這樣,程式循環97次之後停留在“a++”語句上。這樣是非常友善的,避免了我們需要手動循環97次。

最後但也是很重要的是,我們可以設定一個“觀察斷點”,當這個被觀察的變量發生變化時,程式會被停止。

watch [變量]

這裡我們可以設定如下:

watch d

當d的值發生變化時程式會停止運作(例如,當i&gt;97為真時)。

當設定斷點後,使用"run"指令開始運作程式,或按如下所示:

r [程式的輸入參數(如果有的話)]

gdb中,大多數的指令單詞都可以簡寫為一個字母。

不出意外,程式會停留在11行。這裡,我們可以做些有趣的事情。下列指令:

bt

回溯功能(backtrace)可以讓我們知道程式如何到達這條語句的。

使用GDB指令行調試器調試C/C++程式使用GDB指令行調試器調試C/C++程式

info locals

這條語句會顯示所有的局部變量以及它們的值(你可以看到,我沒有為d設定初始值,是以它現在的值是任意值)。

當然:

使用GDB指令行調試器調試C/C++程式使用GDB指令行調試器調試C/C++程式

p [變量]

這個指令可以顯示特定變量的值,而更進一步:

ptype [變量]

可以顯示變量的類型。是以這裡可以确定d是double型。

使用GDB指令行調試器調試C/C++程式使用GDB指令行調試器調試C/C++程式

既然已經到這一步了,我麼不妨這麼做:

set var [變量] = [新的值]

這樣會覆寫變量的值。不過需要注意,你不能建立一個新的變量或改變變量的類型。我們可以這樣做:

set var a = 0

使用GDB指令行調試器調試C/C++程式使用GDB指令行調試器調試C/C++程式

如其他優秀的調試器一樣,我們可以單步調試:

step

使用如上指令,運作到下一條語句,有可能進入到一個函數裡面。或者使用:

next

這可以直接運作下一條語句,而不進入子函數内部。

使用GDB指令行調試器調試C/C++程式使用GDB指令行調試器調試C/C++程式

結束測試後,删除斷點:

delete [行号]

從目前斷點繼續運作程式:

continue

退出gdb:

quit

你對gdb有什麼看法?你會将它與圖形調試器對比嗎,它有什麼優勢呢?對于将gdb內建到vim有什麼看法呢?将你的想法寫到評論裡。

原文釋出時間:2014-11-25

本文來自雲栖合作夥伴“linux中國”

繼續閱讀