Linux複習之gdb除錯舉例

2021-10-07 13:14:03 字數 1484 閱讀 1468

源程式如下,作用是通過呼叫函式輸出1~10的和:

執行編譯指令:gcc -o main main.c ,編譯成功後,執行./main,程式顯示結果result = 45

程式可以順利的編譯鏈結生成可執行檔案,說明沒有出現編譯問題,但是可以看見,輸出結果為134518459,明顯錯誤。正確結果應該是55,下面利用gdb對程式進行除錯,從而找到問題。

為了能夠使用gdb除錯,在由main.c編譯鏈結生產可執行檔案main時,命令列中必須加入選項-g。

具體步驟如下:

1.編譯main.c,指令:gcc -o main main.c -g

2.使用gdb載入main,指令:gdb main

3.進入gdb環境後,使用命令「run「,執行main

發現結果是45,還是錯誤。

4.單步執行和跟蹤函式。輸入start命令開始進行gdb除錯

可以看見程式停留在主函式result = add(1,10);

再次輸入step命令,可以簡寫為s,追蹤到函式add內進行檢視,並使用backtrace,簡寫為bt,檢視函式呼叫棧幀。

可以看見,主函式傳遞引數值start = 1,end = 10.add函式的棧幀編號為0,主函式的棧幀編號為1.

接下來利用info命令,簡寫為i,檢視add函式中區域性變數的值,如果想要檢視主函式中區域性變數的值,可以使用frame 1指令選擇1號棧幀,再使用info來檢視。

當前add函式中的變數i和sum都是隨機值,sum = 134518404,這裡就可以看出來為啥程式執行結果為134518459(sum = 134518404 + 55),所以找到了問題所在,錯誤是由於sum沒有進行初始化而造成的。

當我們發現問題後,有兩張方式進行修改:

第一種,採取在gdb命令列下對函式中的變數進行賦值,執行除錯程式後進行驗證,正確後再退出gdb修改源**。

第二種,可以利用finishi命令讓程式一直執行到從當前函式返回,或者使用continue命令程式執行到程式結束後修改**。

Linux複習之gdb除錯基本指令

初學者在編輯程式時,往往會出現很多的語法錯誤,這些錯誤在編譯階段就會暴露,所以很容易被排除,但是有些錯誤可能出現在程式執行階段,需要深入的測試 除錯和修改。這就使得在一些大型專案裡,程式的除錯變的十分困難,這個時候就需要乙個高效的除錯工具,gdb除錯工具就是當前使用最廣泛的的除錯工具。gdb除錯基本...

linux歷程 GDB除錯

1 gdb主要完成三方面功能 啟動被除錯程式 讓被除錯程式在指定位置停住 當程式被停住時,可以檢查程式狀態 如變數值 2 gdb命令 啟動gdb 兩種方法 1 gdb 除錯程式名 如 gdb helloword 2 gdb file 除錯程式名 list l 檢視程式 括號內表示也可用縮寫 brea...

linux下的gdb除錯

如果編譯時,增加了引數 g,就會生成帶源 除錯符號的可執行檔案。增加的除錯符號一般會使檔案變的大一點。gcc o xx xx.c g 進一步地,就可以執行下面的指令啟動除錯工具進入除錯環境對程式進行除錯了。gdb xx 在除錯環境下,可以輸入下列指令來控制除錯。l n第乙個字母是小寫的l,列出第n行...