使用GDB命令列偵錯程式除錯C C 程式

2021-09-23 16:50:01 字數 2588 閱讀 1358

沒有偵錯程式的情況下編寫程式時最糟糕的狀況是什麼?編譯時跪著祈禱不要出錯?用血祭召喚惡魔幫你執行程式?或者在每一行**間新增printf("test")語句來定位錯誤點?如你所知,編寫程式時不使用偵錯程式的話是不方便的。幸好,linux下除錯還是很方便的。大多數人使用的ide都整合了偵錯程式,但 linux 最著名的偵錯程式是命令列形式的c/c++偵錯程式gdb。然而,與其他命令列工具一致,dgb需要一定的練習才能完全掌握。這裡,我會告訴你gdb的基本情況及使用方法。

大多數的發行版倉庫中都有gdb

debian 或 ubuntu

$ 

sudo

apt-get

install

gdbarch linux

$ 

sudo

pacman -s

gdbfedora,centos 或 rhel:

$sudo 

yuminstall

gdb當學習gdb時,最好有乙份**,動手試驗。下列**是我編寫的簡單例子,它可以很好的體現gdb的特性。將它拷貝下來並且進行實驗——這是最好的方法。

#

include

<

stdio.h

>

#include

<

stdlib.h

>

intmain

(int

argc

,char

**ar**

)return0;

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

$ 

gdb-

tui

[可執行程式名]

使用」-tui「選項可以將**顯示在乙個漂亮的互動式視窗內(所以被稱為「文字使用者介面 tui」),在這個視窗內可以使用游標來操控,同時在下面的gdb shell中輸入命令。

現在我們可以在程式的任何地方設定斷點。你可以通過下列命令來為當前原始檔的某一行設定斷點。

break

[行號]

或者為乙個特定的函式設定斷點:

break

[函式名]

甚至可以設定條件斷點

break

[行號]

if[條件]

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

break

11if

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

vara =0

如其他優秀的偵錯程式一樣,我們可以單步除錯:

step

使用如上命令,執行到下一條語句,有可能進入到乙個函式裡面。或者使用:

next

這可以直接執行下一條語句,而不進入子函式內部。

結束測試後,刪除斷點:

delete

[行號]

從當前斷點繼續執行程式:

continue

退出gdb:

quit

總之,有了gdb,編譯時不用祈禱上帝了,執行時不用血祭了,再也不用printf(「test「)了。當然,這裡所講的並不完整,而且gdb的功能遠遠不止於此。所以我強烈建議你自己更加深入的學習它。我現在感興趣的是將gdb整合到vim中。同時,這裡有乙個備忘錄記錄了gdb所有的命令列,以供查閱。

Perl 命令列偵錯程式的使用

如果使用eclipse寫perl程式,偵錯程式使用起來很方便,只需要滑鼠點點新增斷點然後step over,step in就ok了,但是我們更多數情況下是用putty遠端連線到linux上寫perl指令碼,這時候如果遇到問題需要除錯的時候可就比較麻煩了。我記錄一下我常用的方法吧。當然,第一步是per...

GDB偵錯程式

偵錯程式gdb 一 啟動和退出gdb gdb除錯的物件是可執行檔案,而不是程式的源 如果要使乙個可執行檔案可以被gdb除錯,那麼在使用編譯器gcc編譯程式時需要加入 g選項。gdb除錯乙個程式的命令格式是 gdb 程式檔名 也可以在linux提示符下,直接輸入gdb,然後使用file命令裝入要除錯的...

gdb偵錯程式

在使用gdb偵錯程式之前,必須在編譯程式時加上 g選項 功能 顯示上次內容之前或之後的10行內容,首次使用顯示main 函式之前或之後的10行內容 命令 list 簡稱 l 功能 顯示引數行之前和之後的10行內容.命令 list line number 簡稱 l 10 功能 顯示原始檔從一行到另一行...