1.常用的除錯**的方法:
不管你使用哪種方法除錯**,都需要有足夠的耐性
方法一:在**中加入列印語句--》在關鍵語句的前後(函式呼叫),關鍵變數
方法二:使用gdb除錯(原理也是讓程式分步執行,列印關鍵變數的值)
(1)使用gdb在編譯程式的時候必須加上-g選項(將程式的除錯資訊新增到生成的可執行程式中)
gcc mytree.c -o mytree -g
(2)開始除錯
gdb 程式的名字
(3)常用的gdb除錯命令
不管你使用哪種除錯方法:首先要做的事情是縮小錯誤的範圍
一:列印**內容
l 預設列舉原始碼的前面10行
l 1,20 列舉前面1到20行
二:設定斷點(可以設定多個斷點)
b 行號 程式等會執行到斷點所在的行就停下來
info b 幫助你檢視目前所有的斷點資訊
d 斷點的序號 取消斷點
三:單步執行程式ns
區別:遇到自定義的函式呼叫
n 一下子直接執行完,退出函式
s 進入函式**中,一行行執行
n不會進入函式內部一行行去單步除錯,s會
四:列印變數值
p 變數的名字
五:繼續執行程式
c六:執行程式
r //不帶引數
r 引數 //帶引數執行
如果以上無法確定錯誤**,而且錯誤是段錯誤segmentatin fault(就是你的程式訪問了非法的記憶體,比如使用了野指標)
可以讓 gdb 幫我們直接定位出現段錯誤的地方。
a) 使用 -g 編譯待除錯**
b) 去掉系統對core檔案的大小限制: ulimit -c unlimited
c) 重新讓程式死一遍,產生乙個core檔案
d) 使用 gdb 來直接定位: gdb ./example core (注意:不是100%能解決問題,看運氣)
2.3 如果發生的不是段錯誤,或者用以上辦法,gdb無法直接定位段錯誤的位置,那就只能單步除錯
gdb 可供使用的常用命令:
> list/l/l 10/l 2,30 (列出當前正在除錯的**)
> breakpoint/b 20 (在第20行設定了乙個斷點)
> b 20 if i>=100 (在第20行設定了乙個條件斷點)
> b somefunction (在函式somefunction設定了乙個斷點)
> run/r/r 123 abc (啟動程式開始執行,可以帶參)
> print i/p i (檢視變數i當前的值)
> display i (持續跟蹤變數 i 變化)
> backtrace full/bt full (檢視當前棧記憶體的詳細細節)
> whatis i (檢視變數i的型別)
> next/n (單步執行:函式呼叫將會被當做一步)
> step/s (單步執行:將會進入函式呼叫內部)
> continue/c (繼續執行**,直到遇到下乙個斷點,或者程式退出)
> quit/q (退出偵錯程式gdb)
Linux下C C 除錯工具GDB
例項除錯程式 main.c include int add range int low,int high int main void 以上函式add range功能為從low加到high,基本除錯步驟 1.編譯 gcc g main.c o main 2.除錯 gdb main 3.幫助 gdb h...
linux除錯工具GDB
gdb偵錯程式除錯的物件是可執行檔案,使用gcc或者g 編譯器編譯源 時,必須加上 g才能使目標可執行檔案包含可被除錯的資訊。比如 gcc g o helloworld helloworld.c 編譯並連線程式,使之包含可被除錯資訊 gdb helloworld 使用gdb偵錯程式開啟hellowo...
linux下的程式除錯工具gdb
這裡只列舉最最常用的gdb命令。gdb program 準備除錯程式。也可以直接進入gdb,再通過file命令載入。run args 開始執行程式,run後面可以加程式需要的引數,就像在命令列正常執行時那樣。s n si c kill s即step in,進入下一行 執行 n即step next,執...