gdb調試程序

編寫test2.cexpress

image

 

 

 

 

 

 

 

 

 

 

編譯成可執行文件vim

gcc test2.c -g -o test2
gdb test2

進入gdb調試數組

run命令

run命令格式編輯器

run <arg1...argn>

其中run能夠簡寫成r,gdb中大部分指令能夠簡寫。函數

在gdb中執行優化

run lvyahui blog

能夠看到輸出ui

image

再次運行run能夠不須要再傳遞參數,它會使用最後一次調用run命令傳遞的參數spa

image

能夠看到默認參數3d

image

能夠再次執行帶參數的run或者使用set agrs 修改默認參數調試

image

斷點

設置斷點

break <line-number>

能夠在vim編輯器中查看行號或者經過list/l指令查看行號

image

編輯代碼文件test1.c

image

編譯好test1

gcc test1.c -g -o test1
gdb test1

進入gdb環境

先查看代碼,而後設置一個斷點,再run執行,讓後continue繼續執行

image

在方法前添加斷點

break能夠直接在方法前添加短點

break fun_name

image

在此調試執行

image

刪除斷點

下面看怎麼刪除以前設置的短點

delete breakpoint <point-number> #刪除指定斷點
#或者
delete breakpoints  #刪除全部斷點

其中 delete能夠簡寫成d

image

另外clear命令也能夠用來清除斷點

按表達式設置斷點

break <line number> if expression

image

按照上面的方法步驟設置斷點,發現失敗了,提示No symbol var in current context

起初我覺得是這樣的設置須要在運行中設置,因而在13行設置斷點,運行,當停在13行時,再在第15行設置一個條件斷點,但

最後發現問題依舊。顯然問題不在這裏,後來上網查了下,在編譯時加上一個-gstabs+選項

gcc -g -gstabs+ -c test1.c
gcc test1.o -o test1

再次進入gdb 調試

發現就能夠設置這個條件斷點了

image

可使用readelf看兩次不一樣方法編譯生成的.o文件的符號表有所不一樣。

run執行下看看

可是執行發現斷點沒有起做用

image

雖然不知道爲何,但顯然以前是由於編譯器作了編譯優化,但我明明沒有加任何-OX選項啊。後來把i==50換成i>=50,發現能夠停下來了。

image

真是鬱悶,i怎麼會是這個值呢?

若是是多文件程序,break還能夠指定文件添加斷點,格式以下

break <filename:line-number>
break <filename:fun-name>
#例如
break test1.c:15
break test1.c:main

禁止和啓用斷點

格式

disable/enable breakpoint num

image

觀察點

觀察點也能夠起到斷點的做用

編輯test3.c文件

#include <stdio.h>

int sum(int a){
    int i,res = 0;
    for(i=0;i < a;i++){
        res += i;
    }
    return res;
}
int main(void){
    int a = 10;
    int asum = sum(a);
    printf("asum is %d \n",asum);
    return 0;
}

編譯

gcc -g -gstabs+ -Wall test3.c -o test3

watch 命令須要在運行程序後使用看,因此咱們要先加一個斷點讓程序停下來

image

將斷點刪除,繼續執行

image

查看運行數據

在運行時經常使用print命令來查看數據,再次以前,須要先知道如何單步執行,進入函數,運行到下一個斷點

  • next--執行一行源代碼但不進入函數內部。
  • step--執行一行源代碼並且進入函數內部。
  • continue -- 執行到下一暫停點或程序結束。

再次調試test1程序

image

print的格式

print <expression>
#或者
p <expression>

其中expression能夠是各類形式

表達式

p (i-6)*3+result

函數調用

p func(5)

數組

p *arr_name@arr_length

編寫test4.c

#include <stdio.h>
#include <string.h>

int main(void){
    int arr[] = {1,2,3,4,5};
    int len = 4,i;
    int * arr2 = (int *) malloc(len * sizeof(int));
    for(i=0;i<len;i++){
        arr2[i]= i*2;
    }
    free(arr2);
    return 0;
}

進入gdb調試

image

自動顯示變量

display/fmt expr

image

控制格式的字符更printf的很是類似,在此不作贅述

以上是我的總結的gdb的一些基礎內容,更多內容會在後續博客中說起

相關文章
相關標籤/搜索