Linux下調試函數-----gcc與gdb的使用

這篇博文主要講下如何編寫程序並使用gdb調試段錯誤(core dump)

 

何爲gdb?---百度百科

UNIXUNIX-like下的調試工具。或許,各位比較喜歡那種圖形界面方式的,像VCBCBIDE的調試,但如果你是在UNIX平臺下做軟件,你會發現GDB這個調試工具相比於VCz的優點是具有修復網絡斷點以及恢復鏈接等功能。BCB的圖形化調試器更強大的功能。所謂寸有所長,尺有所短就是這個道理。

 

GDB四個方面的功能:

1、啓動你的程序,可以按照你的自定義的要求隨心所欲的運行程序。

2、可讓被調試的程序在你所指定的調置的斷點處停住。(斷點可以是條件表達式

3、當程序被停住時,可以檢查此時你的程序中所發生的事。

4、你可以改變你的程序,將一個BUG產生的影響修正從而測試其他BUG


在我們編寫完程序之後呢,假裝我們想要調試,那麼該如何進入gdb模式呢。?文件名是test.c
gcc -g test.c -o test     //-g 爲調試選項  -o 爲寫入文件
gdb test                       //進入gdb模式




這時候的我們就進入了gdb模式,這時候不得不提一下gdb模式下的些許操作選項


list (l)                   列出源代碼 後面加上行號可從該行開始顯示
break (b) 42        在42行設置斷點
b 函數名            在函數處設置斷點
info break (i b)    顯示斷點信息
delete i (d i)        刪除斷點
run (r)                 開始執行
next (n)              單步執行不進入函數,相當於F10
s                        進入函數 F11
print 變量i (p i)   打印變量的值b 行號
if(i==9)               第幾行的斷點,在運行到i==9的時候停止
backtrace (bt)    顯示函數調用棧的關係
what is i             i是什麼類型
enter                  重複上一步操作
finish                 結束函數
q                       退出gdb模式
PS:括號裏面皆爲首字母,相同含義。

舉個有bug的栗子:文件名  test.c

1 #include<stdio.h>

  2 int main()

  3 {

  4     int a;

  5     printf("please enter num:");

  6     scanf("%d", a);//很明顯這裏沒有加取址符&

  7     printf("%d", a);

  8     system("pause");

  9     return 0;

 10 }


然後呢,開始調試:
gcc -g test.c -o test     //-g 爲調試選項  -o 爲寫入文件
file test           //file指令可以看見此時的test已變成ELF格式的可執行文件
./test              //運行程序,然後報core dump段錯誤
ls                  //打開目錄查看段錯誤



ulimit -a//顯示當前各進程的限制,可見core文件大小限制等於0

ulimit -c unlimited//設置成無窮大

ulimit -c  //查看是否設置成功,成功顯示unlimited

file core.4798  //假裝查看名爲4798的段錯誤文件




gdb ./test core.4798//開始調試,此時可以看到哪塊地方程序崩潰掉的



然後我們就知道是這個scanf函數發生的毛病,在添加取址符&之後就可以運行程序啦。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章