linux c之gdb常用斷點除錯總結

chenyu_insist發表於2016-12-29

1 、安裝GDB

sudo apt-get install gdb

2 、怎麼打斷點

1 、原始檔的某一行設定斷點

break 行號

2、一個特定的函式設定斷點

break 函式名

3、設定條件斷點

break 行號 if 條件

3、舉例分析

hello2.c原始檔如下

#include<stdio.h>

int main() { 
   int a = 1, b = 2, c = 3;
   int i;
   printf("hello chenyu");  
   for (i = 0 ; i < 100; i++) {
    	++a;
        if (i > 90) {
            ++b;
        } else {
            ++c;
        }
   } 
   printf("a = %d, b = %d, c = %d", a, b, c);
   int cc = 0;
   for (cc; cc < 9; cc++) {
        printf("c %d", i);
   }
   return 0;
}

比如我們在 ++b (第10行)這行和printf("c %d", i)(第18行)這兩行打斷點命名如下

1、編譯

gcc -g hello2.c

2、gdb除錯

gdb hello2

3、顯示程式碼行數命令如下

list
3次回車

4 、然後輸入下面打斷點命令

break 10

break 18

圖片如下:


5 、 執行並且跳轉到斷點

1、執行

start

2 、跳轉到斷點命令(countine 簡寫c)

c

程式就到到++b 這行來,上面2個步驟也可以用這個run (簡寫 r)命令程式碼

r

我們這裡程式碼會跳到這個斷點裡面來,我麼就避免了手動迴圈這麼多次,因為這個斷點會打很多次,所以我們可以用c命令,還是會在這行,所以打斷點一般不要打在迴圈裡面,當這個程式碼執行完之後,我們再用c命令,就會列印18行的程式碼

我們也可以用watch命令來觀察變數,如果變數的值發生變化,程式就會停止

watch b

我麼看變數的值或則單個變數的值可以用下面命令

i locals

p c

進入函式內部用下面命令

s

單步除錯往下執行用下面命令

n

刪除斷點

delete 行號

退出gdb命令

quit

4、如何儲存斷點

有時候執行時,上次打的斷點沒了,怎麼儲存呢?

1、檢視斷點資訊並儲存

info b

2 、儲存斷點

save breakpoint fig.dp

斷點儲存在fig.dp檔案裡面

3、除錯時候讀取儲存斷點檔案

gdb hello2 -x fig.dp

要記住加上引數 -x

然後再去檢視是否有斷點

info b

可以看到是有2個斷點的

5、總結

       學會了gdb打斷點的基本命令,還有一些除錯手段,以及斷點的儲存。

相關文章