編寫test2.cexpress
編譯成可執行文件vim
gcc test2.c -g -o test2
gdb test2
進入gdb調試數組
run命令格式編輯器
run <arg1...argn>
其中run能夠簡寫成r,gdb中大部分指令能夠簡寫。函數
在gdb中執行優化
run lvyahui blog
能夠看到輸出ui
再次運行run能夠不須要再傳遞參數,它會使用最後一次調用run命令傳遞的參數spa
能夠看到默認參數3d
能夠再次執行帶參數的run或者使用set agrs 修改默認參數調試
break <line-number>
能夠在vim編輯器中查看行號或者經過list/l指令查看行號
編輯代碼文件test1.c
編譯好test1
gcc test1.c -g -o test1
gdb test1
進入gdb環境
先查看代碼,而後設置一個斷點,再run執行,讓後continue繼續執行
break能夠直接在方法前添加短點
break fun_name
在此調試執行
下面看怎麼刪除以前設置的短點
delete breakpoint <point-number> #刪除指定斷點
#或者
delete breakpoints #刪除全部斷點
其中 delete能夠簡寫成d
另外clear命令也能夠用來清除斷點
break <line number> if expression
按照上面的方法步驟設置斷點,發現失敗了,提示No symbol var in current context
起初我覺得是這樣的設置須要在運行中設置,因而在13行設置斷點,運行,當停在13行時,再在第15行設置一個條件斷點,但
最後發現問題依舊。顯然問題不在這裏,後來上網查了下,在編譯時加上一個-gstabs+選項
gcc -g -gstabs+ -c test1.c gcc test1.o -o test1
再次進入gdb 調試
發現就能夠設置這個條件斷點了
可使用readelf看兩次不一樣方法編譯生成的.o文件的符號表有所不一樣。
run執行下看看
可是執行發現斷點沒有起做用
雖然不知道爲何,但顯然以前是由於編譯器作了編譯優化,但我明明沒有加任何-OX選項啊。後來把i==50換成i>=50,發現能夠停下來了。
真是鬱悶,i怎麼會是這個值呢?
若是是多文件程序,break還能夠指定文件添加斷點,格式以下
break <filename:line-number> break <filename:fun-name> #例如 break test1.c:15 break test1.c:main
格式
disable/enable breakpoint num
觀察點也能夠起到斷點的做用
編輯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 命令須要在運行程序後使用看,因此咱們要先加一個斷點讓程序停下來
將斷點刪除,繼續執行
在運行時經常使用print命令來查看數據,再次以前,須要先知道如何單步執行,進入函數,運行到下一個斷點
再次調試test1程序
爲
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調試
display/fmt expr
控制格式的字符更printf的很是類似,在此不作贅述
以上是我的總結的gdb的一些基礎內容,更多內容會在後續博客中說起