這篇文章是初次嘗試gdb除錯後寫的,這個案例結合了我個人的分析,在gdb第一次執行當中遇到困難的可以看一看。
開始接觸linux核心的第二天,學的是一段小小的程式設計,然後實驗就是使用gdb除錯並糾錯,這裡附上**:
/* 這是乙個有錯誤的c程式 */
#include
#include
static char buff[256];
static char* string;
int main()
目的很明顯,就是手動輸入一段字串,再由計算機獲得資料並實現輸出,也就是說,輸入什麼,就要輸出什麼。
用gedit寫好程式,儲存為test.c,然後開始使用gcc編譯。
在終端輸入gcc + xx.c 即可呼叫gcc進行編譯:
gcc -g test.c -o test(注意:這裡我把經過編譯後的test.c輸出為test,否則預設輸出是a.out,這裡-o就是指定檔名的作用了。-g選項在可執行檔案中加上原始檔資訊.)
我們可以看到,編譯完成之後,資料夾下多出了乙個可執行檔案,即編譯完成後的test。
在終端下輸入:./test 即可執行該程式。試執行: $
./test
please input your string:as -------提示輸入字串
segmentation fault(core dumped) -------段錯誤(吐核)
解釋一下段錯誤及其原因和解決方案請看這裡:
接下來開始gdb除錯。
gdb 是乙個用來除錯 c 和 c++ 程式的強力偵錯程式,它使你能在程式執行時觀察程式的內部結構和記憶體的使用情況。 以下是 gdb 所提供的一些功能:
終端輸入:$
gdb test
(gdb) 【看到(gdb)就代表著進入了gdb的編輯區域了!!!】
載入之後,首先得啟動吧,執行:
(gdb)
runstarting program: /home/xin/文件/huibian/bugging/test
please input your string:as【跟gcc編譯時一樣,提示輸入字串】
program received signal sigsegv, segmentation fault.【同樣出現了段錯誤】
_io_gets (buf=0x0) at iogets.c:55
55 buf[0] = (char) ch;
【上面兩行馬上會在下面提到,看樓下~~】
執行查詢錯誤使用where命令:
(gdb)
where
#0 _io_gets (buf=0x0) at iogets.c:55
#1 0x08048452 in main () at test.c:9
#0 _io_gets (buf=0x0) at iogets.c:55 ———gets函式的緩衝區溢位錯誤;
#1
0x08048452
in main () at test.c:9 ———由於上面的緩衝區溢位錯誤,使得
在test.c檔案中的第9行呼叫
main函式也出現了錯誤(注:
0x08048452是緩衝區溢位的一種表現)】
由上面的分析知道,在第9行出現的錯誤,即gets(string)附近,使用list命令檢視即9行附近的**:
(gdb) listtest.c:9
1 #include
2 #include
3
4 static char buff[256];
5 static char* string;
6 int main()
7
重新編譯,執行:
$ ./test
please input your string:as
your string is:as
這次成功完成了!!!
(撒花!!!~~)
gdb 除錯 vs除錯
一 先要生成二進位制檔案 g g 1.cpp o 1.out g引數不要省,不然 gdb l 引數用不了 二 引數 設定斷點 設定 函式斷點break func 在某行設定斷點break 7 檢視斷點資訊 info break 刪除斷點 d 刪除所有斷點 d 3 刪除第三個 執行 r 下一步 n 逐...
GDB除錯命令以及GDB除錯段錯誤
一 gdb的除錯命令。c語言是 cc g tst.c o tst c 是g g o 生成的檔案 file.cpp c 除錯程式命令 gdb file 啟動,羅列 行數ist 1,break 行數 info break,run r 除錯執行,step s 單步除錯,檢視變數 print p 變數名,檢...
gdb除錯命令
一 gdb常用命令簡介 rrun 執行.程式還沒有執行前使用 c cuntinue 執行到下一斷點處 qquit 退出tab tab命令補全功能 h help幫助s step 跟入函式 nnext 執行下一行的 如果是函式呼叫,也當作一行 執行到此函式返回 b breakpoint 設定斷點,用法 ...