Linux下C語言的除錯

2021-07-22 17:42:36 字數 3653 閱讀 6022

除錯是每個程式設計師都會面臨的問題. 如何提高程式設計師的除錯效率, 更好更快地定位程式中的問題從而加快程式開發的進度, 是大家共同面對的問題. 可能windows使用者順口就會說出:用vc唄 :-) , 它提供了設定斷點, 單步跟蹤等的圖形介面, 使除錯起來直觀易用. 但linux使用者可能要生悶氣了 o:-) : 難道我們linux程式設計師就只能使用原始的除錯方法, 在**中加入printf資訊嗎?難道linux下就沒有好的c語言除錯工具嗎?

當然不是了. gnu早就組織開發了一套c語言編譯器(gcc)和除錯工具(gdb). gdb雖然沒有圖形化的友好介面, 但是它強大的功能也足以與微軟的vc工具相媲美, 給linux程式設計師帶來了福音. 下面通過乙個簡單的例子, 演示一下gdb的使用流程:

示例檔案 demo.c 的源**如下:

#include int sum(int, int);

intmain()

intsum(int a, int b)

編譯原始檔, 生成可執行檔案

$ gcc -g -wall -o demo demo.c
雖然這段程式沒有錯誤, 但除錯完全正確的程式可以更加了解gdb的使用流程. 接下來就啟動gdb進行除錯.

注意:

(1) 啟動gdb

$ gdb demo

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/demo...done.

可以看出, 在gdb的啟動畫面中指出了gdb的版本號, 使用的庫檔案等頭資訊, 接下來就進入了由」(gdb)」開頭的命令列介面了.

(2) 檢視原始檔

在gdb中鍵入」l」(list的縮寫)可以檢視所載入的檔案, 如下所示:

(gdb) l

1       #include

23       int sum(int, int);

45           int

6       main()

7      

1415          int

16      sum(int a, int b)

17      

(gdb) l

line number 20 out of range; demo.c has 19 lines.

可以看出, gdb列出的源**中明確地給出了對應的行號, 這樣就可以大大地方便**的定位.

(3) 設定斷點

設定斷點是除錯程式中乙個非常重要的手段, 它可以使程式到一定位置暫停執行. 因此,可以在該位置方便地檢視變數的值, 堆疊情況等, 從而找出**的癥結所在.

在gdb中設定斷點非常簡單, 只需在」b」後加入對應的行號即可(這是最常用的方式). 如下所示:

(gdb) b 9

breakpoint 2 at 0x4004f4: file demo.c, line 9.

注意:該斷點的作用是當程式執行到第 9 行時暫停(第 8 行執行完畢, 第 9 行未執行)

(4) 檢視斷點資訊

(gdb) info b

num     type           disp enb address            what

2       breakpoint     keep y   0x00000000004004f4 in main at demo.c:9

(5) 執行**

接下來就可執行**了, gdb預設從首行開始執行**, 可鍵入」r」(run的縮寫)即可. 若想從程式中指定的行開始執行, 可在r後面加上行號.

(gdb) r

starting program: /home/wangsheng/tmp/demo/gdb/demo

breakpoint 2, main () at demo.c:9

9           int a = 1, b = 2;

可以看到程式執行到斷點處就停止了.

(6) 檢視變數值

鍵入p(print的縮寫)+變數名即可檢視該變數在此時的值

(gdb) p a

$1 = 1

(gdb) p b

$2 = 2

(gdb) p result

$3 = 32767

注意:這裡之所以result是乙個莫名其妙的值, 是因為宣告result是沒有初始化, 其值是不固定的。

(7) 單步執行

單步執行可以使用n(next的縮寫)或者s(step的縮寫), 它們之間的區別在於: 若有函式呼叫的時候, s會進入該函式而n不會. 因此, s就類似於vc等工具中的」step in」, n就類似於vc等工具中的」step over」.

如果使用n命令顯示如下:

(gdb) n

10          result = sum(a, b);

下面使用 s 命令,跟蹤進入 sum 函式:

(gdb) s

sum (a=1, b=2) at demo.c:18

18          return a + b;

可以看出執行 s 命令時進入了sum函式內部, 如果用 n 命令則跳過函式的呼叫部分

(8) 恢復程式執行

在檢視變數值以及堆疊之後, 就可以使用命令c(continue)恢復程式的正常執行了. 這時, 它會把剩餘還未執行的程式執行完, 並顯示剩餘程式的執行結果.

(gdb) c

continuing.

1 + 2 = 3

program exited normally.

可以看出, 程式在執行完後退出, 之後程式處於」停止狀態」.

說明:在gdb中, 程式的執行狀態有」執行」,」暫停」和」停止」3種. 其中」暫停」狀態是程式遇到了斷點或者觀察點, 程式暫時停止執行, 而此時函式的位址, 函式引數, 函式內的區域性變數都會被壓入」棧(stack)中. 故在這種狀態下可以檢視函式的變數值等各種屬性. 但在函式處於」停止」狀態之後, 「棧」就會自動撤銷, 它也就無法檢視各種資訊了

關於gdb的更多命令, 你可以在啟用gdb後, 輸入help命令檢視.

要退出gdb時,只用發quit或命令簡稱q就行了

Linux下C語言的除錯

除錯是每個程式設計師都會面臨的問題.如何提高程式設計師的除錯效率,更好更快地定位程式中的問題從而加快程式開發的進度,是大家共同面對的問題.可能windows使用者順口就會說出 用vc唄 它提供了設定斷點,單步跟蹤等的圖形介面,使除錯起來直觀易用.但linux使用者可能要生悶氣了 o 難道我們linu...

Linux下C語言的除錯

除錯是每個程式設計師都會面臨的問題.如何提高程式設計師的除錯效率,更好更快地定位程式中的問題從而加快程式開發的進度,是大家共同面對的問題.可能windows使用者順口就會說出 用vc唄 它提供了設定斷點,單步跟蹤等的圖形介面,使除錯起來直觀易用.但linux使用者可能要生悶氣了 o 難道我們linu...

linux下的C語言開發(gdb除錯)

編寫 過程中少不了除錯。在windows下面,我們有visual studio工具。在linux下面呢,實際上除了gdb工具之外,你沒有別的選擇。那麼,怎麼用gdb進行除錯呢?我們可以一步一步來試試看。cpp view plain copy include int iterate int value...