沒有偵錯程式的情況下編寫程式時最糟糕的狀況是什麼?編譯時跪著祈禱不要出錯?用血祭召喚惡魔幫你執行程式?或者在每一行**間新增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:
$sudoyuminstall
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[條件]
例如,在我們的示例**中,可以設定如下:
break11if
i >
97這樣,程式迴圈97次之後停留在「a++」語句上。這樣是非常方便的,避免了我們需要手動迴圈97次。
最後但也是很重要的是,我們可以設定乙個「觀察斷點」,當這個被觀察的變數發生變化時,程式會被停止。
watch[變數]
這裡我們可以設定如下:
watchd當d的值發生變化時程式會停止執行(例如,當i>97為真時)。
當設定斷點後,使用"run"命令開始執行程式,或按如下所示:
r[程式的輸入引數(如果有的話)]
gdb中,大多數的命令單詞都可以簡寫為乙個字母。
不出意外,程式會停留在11行。這裡,我們可以做些有趣的事情。下列命令:
bt回溯功能(backtrace)可以讓我們知道程式如何到達這條語句的。
infolocals
這條語句會顯示所有的區域性變數以及它們的值(你可以看到,我沒有為d設定初始值,所以它現在的值是任意值)。
當然:
p[變數]
這個命令可以顯示特定變數的值,而更進一步:
ptype[變數]
可以顯示變數的型別。所以這裡可以確定d是double型。
既然已經到這一步了,我麼不妨這麼做:
setvar[變數]
=[新的值]
這樣會覆蓋變數的值。不過需要注意,你不能建立乙個新的變數或改變變數的型別。我們可以這樣做:
setvara =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 功能 顯示原始檔從一行到另一行...