功夫再牛也怕菜刀,程式設計師不可能不犯錯誤,在linux下面除錯我們使用gdb,這次就講他的使用,它可以除錯c和c++,gdb提供的功能有:
1.監視程式中的變數的值
2。設定斷點停止**執行
3,一行行的執行
使用方式很簡單,在命令列鍵入gdb就能用了,正常啟動就會有如下類似的內容,
在這裡可以鍵入命令來指定想要除錯的檔名
$:gdb filename
這是就自動化裝入了這個filename的檔案
下面對乙個**進行分析 使用gdb進行除錯
這個程式作用是將乙個字串反序輸出,字串為"hello world";
**如下:
然後編譯用命令
$:gcc -o test gdbtest.c
然後執行
$:./test
顯示為發現第二個函式起到作用,大家是個明眼人應該已經看出來程式錯在**,不過我們還是來除錯下
使用命令
gcc gdbtest.c -g -o test
這條命令為了使程式在編譯的時候加入除錯資訊,除錯資訊包括程式裡的每個變數的型別和在可執行檔案力的位址對映以及源**的行號;
然後使用
gdb test ;命令,進入test可執行檔案,進入gdb後,輸入run命令執行test,結果顯示如下:
陳尋執行結果和程式外執行結果沒有什麼不同,所以在for語句後面設定乙個斷點,首先要查處for語句的行號,在gdb下面輸入list可以列出**;
list預設列出10行**,按回車就預設重複上一條命令,知道列完,我們發現應該在14行出加入斷點,所以設定斷點方法為
這樣就設定了個斷點,再次輸入run,就會停在15行「string2[size-i]=string[i];"處,如圖
可以設定乙個觀察點來觀察string2[size-i]的值,
$:watch string2[size-i]
然後輸入命令c來繼續執行直到停止在下次迴圈體語句處,經過第一次迴圈,gdb顯示如下:
大家從這個句子就發現了問題了把,這麼交換的結果就是string2的第乙個字元是個空子符,這就解釋了為了什麼沒輸出,驗證下我們一直回車下去;為了方便,連i也一起watch了把;看到了
當i=11是就賦值完了『!』,而string2的第乙個[0]的位置卻沒值,仍然是初始化後的'/0',程式修改方法
「string2[size-i]=string[i];」改為「
string2[size-i-1]=string[i];「
「string2[size+1]='/0';」改為「
string2[size]='/0';
」就ok啦~
發現我這個版本的gdb有點小bug,問題就在上上面那張圖上,new value 和 old value顯然有點寫反了……
gdb基本命令
file
裝入想要除錯的可執行檔案。
kill
終止正在除錯的程式。
list
執行一行源**但不進入函式內部。
next
執行一行源**但不進入函式內部。
step
執行一行源**而且進入函式內部。
run執行當前被除錯的程式
quit
終止 gdb
watch
使你能監視乙個變數的值而不管它何時被改變。
break
在**裡設定斷點, 這將使程式執行到這裡時被掛起。
make
使你能不退出 gdb 就可以重新產生可執行檔案。
shell
使你能不離開 gdb 就執行 unix shell 命令。
gdb的呼叫:
一般情況下gdb命令只是用乙個引數:gdb《可執行程式名》
同時,如果程式執行時產生了段錯誤,會在當前目錄下面產生核心記憶體印象core檔案,可以在指定的執行檔案的同時為可執行程式指定乙個core檔案:
gdb《可執行檔名》core
除此之外,還可以為要置信的檔案指定乙個程序號
gdb《可執行檔名》core《程序號》
比如將test指定程序號3000,
gdb test 3000
那麼首先gdb會尋找乙個檔名為3000的檔案,如果沒有的話,則把除錯程式test的pid設為3000.
意義在於
如果程式是乙個服務程式,那麼可以指定這個服務程式執行時的程序id。gdb會自動attach上去,並除錯它。program應該在path環境變數中搜尋得到。
gdb啟動時,可以加上一些gdb的啟動開關,詳細的開關可以用gdb -help檢視。下面只列舉一些比較常用的引數:
-symbols
-s 從指定檔案中讀取符號表。
-se file
從指定檔案中讀取符號表資訊,並把它用在可執行檔案中。
-core
-c 除錯時core dump的core檔案。
-directory
-d 加入乙個原始檔的搜尋路徑。預設搜尋路徑是環境變數中path所定義的路徑。 /
使用gdb,, 除錯apache
首先學習下gdb命令 gdb gdb file program tab 命令補全 命令標記 info,break,print,stack,watch,x,c,n,s,b,q,quit,step,next,help,list,set,delete,disable,enable,run,file,br,...
使用GDB進行除錯
使用gdb除錯c程式 gdb是gnu開源組織發布的乙個非圖形化的unix下的程式除錯軟體。它能使使用者在程式執行時觀察資料的內部結構和記憶體使用情況。gdb提供的主要功能 1 監視程式中的變數值 2 設定斷點,使程式在指定 行停止。3 單步執行 4 動態改變程式的執行環境 等一 除錯乙個簡單的程式 ...
使用GDB除錯C
gdb是乙個由gnu開源組織發布的 unix linux作業系統下的 基於命令列的 功能強大的程式除錯工具。gdb除錯利器 ubuntu14.04自帶gnu gdb 7.7,無需安裝。生成可執行檔案然後執行gdb即可。g g std c 11 test.cpp o test gdb test gdb...