在windows作業系統下,我們的執行程式有兩個版本。
debug開發除錯版本
得到的可執行檔案.exe檔案相對較大,其中包含除錯資訊。且不做任何優化,未開發人員提供強大的應用除錯能力
release發行版本
檔案相對較小,不包含除錯資訊,並進行了各種優化,以期達到**最小和速度最優。為使用者的使用提供便利。
在linux作業系統下,我們通過gcc來完成**的編譯鏈結,命令:gcc -o main main.c 其生成的可執行檔案與release版本下生成的可執行檔案相像,均不包含除錯資訊,若想其包含除錯資訊,需要在其命令後加入命令-g,即gcc -o main main.c -g,此時生成的檔案即可進行除錯。linux下除錯需要借助除錯工具gdb。
gdb除錯總結
gdb除錯的物件:程序
1、進入除錯
命令gcc -o main mian.c -g,產生包含除錯資訊的可執行檔案main,
命令gdb main進入除錯模式
注意:輸入命令結束並按回車鍵後若顯示最後乙個單詞為done在進入除錯模式,否則,可能第一次命令未輸入-g導致未產生包含除錯資訊的可執行檔案。
2、顯示**以進行加斷點操作
命令 l
若**顯示不全則繼續輸入命令l/回車鍵,回車鍵為繼續執行上一次輸入的命令
斷點操作
加斷點 命令b 行號(l後顯示的行號)
顯示斷點資訊 命令info break
刪除斷點 delete 斷點編號(info break 後顯示的編號)
啟動除錯/執行程式
命令 r
除錯過程
單步執行 命令 n
進入函式 命令 s
退出函式 命令 finish
列印 命令 p 變數
繼續執行 命令 c (遇到斷點就會停止,如果想要越過斷點,需要delete刪除斷點)
顯示當前位置/函式呼叫棧資訊(關係) 命令 bt
退出除錯 命令 q
注意:若想退出死迴圈程序。按ctrl+c
除錯例項
在linux下建立普通檔案main.c,內容為:
#include
#include//
#include
int main()
;printf("input:\n");
fgets(buff,128,stdin);
if(strcmp(buff,"end")==0)
printf("read:%s\n",buff);
}printf("main over\n");
exit(0);
}除錯後,可以很明顯的發現其原因是在liunx環境下,在字元轉結尾會自動補\n標記,這不同於window下的\0標記,所以鍵盤輸入的「end」和**中比較的「end」無法匹配,需要將strcmp中進行匹配的「end」改為「end\n」。
Linux gdb除錯總結
進入除錯 1 輸入gdb 檔名 2 輸入gdb file 檔名 l 顯示源 預設顯示main函式所在檔案的源 list 檔名 num 顯示指定檔案指定行附近的源 b breakpoint的簡寫,設定斷點。b 行號 給指定行新增斷點 b 函式名 給指定函式新增斷點 b 檔名 行號 給指定檔案指定行新增...
linux gdb除錯彙編
1 除錯hello,要求編譯時指定了 gstabs選項 2 執行hello deepfuture lx deepfuture lx desktop private mytest hello hello,world abcd 3 用gdb開啟hello deepfuture lx deepfuture...
Linux gdb 除錯模式
linux gdb 除錯 編譯除錯版本的檔案 include g 啟動gdb除錯 若有main 有設定引數則可以在gdb下設定傳遞引數 set args gdb一些命令 1.run 執行整個程式 2.start 開始除錯 3.next n 逐條語句執行 4.step 逐條語句執行,並且嘗試進入函式內...