除錯是所有程式設計師都會面臨的問題. 如何提高程式設計師的除錯效率, 更好更快地定位程式中的問題從而加快程式開發的進度, 是大家共同面對的問題. 就如讀者熟知的windwos下的一些除錯工具, 如vc自帶的設定斷點, 單步跟蹤等, 都受到了廣大使用者的讚賞. 那麼, 在liunx下有什麼好的除錯工具呢?
gdb是一款gnu開發組織並發布的linux下的程式除錯工具. 雖然它沒有圖形化的友好介面, 但是它強大的功能也足以與微軟的vc工具相媲美.
下面舉乙個例子, 演示一下gdb的使用流程:
測試檔案 test.c 的**如下:
#include
int sum(int m);
int main()
printf("the sum of 1-50 is %d \n", n);
}int sum(int m)
編譯源**檔案, 生成可執行檔案.
注意:一定要加上選項"-g", 這樣編譯出的可執行**中才包含除錯資訊, 否則gdb無法載入該可執行檔案.
$ gcc -g test.c -o test
雖然這段程式沒有錯誤, 但除錯完全正確的程式可以更加了解gdb的使用流程. 接下來就啟動gdb進行除錯. 注意, gdb進行除錯的是可執行檔案, 而不是".c"原始檔, 因此, 需要先通過gcc編譯生成可執行檔案才能用gdb進行除錯.
啟動gdb
$gdb test
gnu gdb (gdb) 7.0-debian
license gplv3+: gnu gpl version 3 or later
this is free software: you are free to change and redistribute it.
there is no warranty, to the extent permitted by law. type "show copying"
and "show warranty" for details.
this gdb was configured as "x86_64-linux-gnu".
for bug reporting instructions, please see:
...reading symbols from /home/wangsheng/tmp/demo/gdb/test...done.
可以看出, 在gdb的啟動畫面中指出了gdb的版本號, 使用的庫檔案等頭資訊, 接下來就進入了由"(gdb)"開頭的命令列介面了.
(1) 檢視原始檔
在gdb中鍵入"l"(list的縮寫)可以檢視所載入的檔案, 如下所示:
(gdb) l
1 #include
2 int sum(int m);
3 int main()
4
(gdb) l
11 printf("the sum of 1-50 is %d \n", n);
12 }
1314 int sum(int m)
15
(gdb) l
line number 21 out of range; test.c has 20 lines.
可以看出, gdb列出的源**中明確地給出了對應的行號, 這樣就可以大大地方便**的定位.
(2) 設定斷點
設定斷點是除錯程式中乙個非常重要的手段, 它可以使程式到一定位置暫停執行. 因此,可以在該位置方便地檢視變數的值, 堆疊情況等, 從而找出**的癥結所在.
在gdb中設定斷點非常簡單, 只需在"b"後加入對應的行號即可(這時最常用的方式). 如下所示:
(gdb) b 6
breakpoint 1 at 0x4004fb: file test.c, line 6.
注意: 該斷點的作用是當程式執行到第6行時暫停(第5行執行完畢, 第6行未執行)
(3) 檢視斷點情況
在設定完斷點之後, 使用者可以鍵入"info b" 來檢視設定斷點情況, 在gdb中可以設定多個斷點.
(gdb) info b
num type disp enb address what
1 breakpoint keep y 0x00000000004004fb in main at test.c:6
(4) 執行**
接下來就可執行**了, gdb預設從首行開始執行**, 可鍵入"r"(run的縮寫)即可. 若想從程式中指定的行開始執行, 可在r後面加上行號.
(gdb) r
starting program: /home/wangsheng/tmp/demo/gdb/test
breakpoint 1, main () at test.c:6
6 sum(50);
可以看到程式執行到斷點處就停止了.
(5) 檢視變數值
在程式停止執行之後, 程式設計師所要做的工作是檢視斷點處的相關變數值. 在gdb中只需鍵入"p"(print的縮寫) +變數名稱 即可.
(gdb) p n
$1 = 0
(gdb) p i
$2 = 0
(6) 單步執行
單步執行可以使用n(next的縮寫)或者s(step的縮寫), 它們之間的區別在於: 若有函式呼叫的時候, s會進入該函式而n不會. 因此, s就類似於vc等工具中的"step in", n就類似於vc等工具中的"step over".
下面是使用n命令的輸出
(gdb) n
the sum of 1-m is 1275
7 for(i=1; i<=50; i++)
下面是使用s命令的輸出
(gdb) s
sum (m=50) at test.c:16
16 int i, n=0;
可以看出執行s命令時進入了sum函式內部, 而n命令則跳過函式的呼叫部分
(7) 恢復程式執行
在檢視變數值以及堆疊之後, 就可以使用命令c(continue)恢復程式的正常執行了. 這時, 它會把剩餘還未執行的程式執行完, 並顯示剩餘程式的執行結果.
(gdb) c
continuing.
the sum of 1-m is 1275
the sum of 1-50 is 1275
program exited with co
de 031.
可以看出, 程式在執行完後退出, 之後程式處於"停止狀態".
說明: 在gdb中, 程式的執行狀態有"執行","暫停"和"停止"3種. 其中"暫停"狀態是程式遇到了斷點或者觀察點, 程式暫時停止執行, 而此時函式的位址, 函式引數, 函式內的區域性變數都會被壓入"棧(stack)中. 故在這種狀態下可以檢視函式的變數值等各種屬性. 但在函式處於"停止"狀態之後, "棧"就會自動撤銷, 它也就無法檢視各種資訊了.
C 語言偵錯程式是如何工作的?
當你用 gdb 的時候,可以看到它完全控制了應用程式程序。當你在程式執行的時候用ctrl c,程式的執行就能夠終止,而gdb能展示它的當前位址 堆疊跟蹤資訊之類的內容。但是它是怎麼辦到的呢?開始,讓我們先研究它怎樣才會不工作。它不能通過閱讀和分析程式的二進位制資訊來模擬程式的執行。它其實能做,而那應...
2016 12 27linux下的C語言gdb除錯
gdb除錯程式 所謂除錯,是對編好的程式用各種手段進行查錯和排錯的過程,指的是對程式的執行過程 程式中的變數進行各種分析和處理。gdb簡介 gdb是乙個功能強大的除錯工具,可以用來除錯c程式或者c 程式。主要使用gdb進行下面5個方面的操作 1.啟動程式 2.設定斷點 行數 程式名稱 條件表示式 3...
python的偵錯程式 Python 偵錯程式入門
python 生態系統包含豐富的工具和庫,可以讓開發人員更加舒適。例如,我們之前已經介紹了如何使用互動式 shell 增強 python。本文重點介紹另一種可以節省時間並提高 python 技能的工具 python 偵錯程式。python 偵錯程式 python 標準庫提供了乙個名為 pdb 的偵錯...