目錄
一、預備知識
二、常用指令
三、調試技巧
(一)監視變量的變化指令 watch
(二)更改指定變量的值 set var
正文
一、預備知識
程序的發布形式有兩種,debug和release模式,Linux gcc/g++出來的二進制程序默認是release模式。
要使用gdb調試,必須在源代碼生成二進制程序的時候加上-g 選項,如果沒有程序無法編譯。
gdb還有個不友好的點是調試時無法直接看到源碼,所以使用cgdb調試器。
以下是調試中用到的代碼,先創建一個mycmd.c文件將下面代碼寫入,gcc mycmd.c -o mycmd生成可執行文件然后開啟我們的調試之旅
二、常用指令
(1)進入cgdb?調試界面
cgdb?文件名:cgdb mycmd
(2)顯示源代碼:list/l
list/l:?????????????????????????????顯示源代碼
list/l?函數名:?????????????????列出指定函數的源代碼? ? ? ? ?list/l main
list/l 文件名:行號 :????????列出指定文件的源代碼?????????list/l mycmd.c:1
(3)退出指令:quit
(4)打斷點指令:break/b
break/b 行號:?在指定行設置斷點,該行數會有高亮提醒,對應VS調試中的F9操作
? ? ? ??
(5)查看斷點指令: info b/break
info b:查看所有斷點信息,前面的1、2...數字表示斷點的個數編號,編號根據打斷點次數依次遞增不受刪除斷點影響
(6)刪除斷點指令:delete/d
d 斷點編號:刪除斷點必須通過編號刪除,要知道編號得先執行查看獲取
刪除第2編號斷點,再次查看已沒編號2
(7)刪除所有斷點指令:delete/d? breakpoints
(8)從程序開始連續執行指令:run/r
第一:gdb啟動調試時只是開啟了gdb,程序并沒有被調試起來必須輸入r
第二:run/r表示在gdb場景中啟動我們的程序mycmd
第三:在沒打任何斷點的情況下run/r從頭開始執行程序
第四:有斷點run/r執行程序時跳到第一個斷點處開始執行
(9)逐過程調試指令:n/next
單步執行,不進入函數內部,對應VS調試中的F10
(10)逐語句調試指令:s/step
單步執行,進入函數內部,對應VS調試中的F11
(11)跟蹤變量值的指令:display 變量名
在循環過程中想觀察變量的數值變化可以使用此語句,display后最前面的數字表示變量編號,對應VS調試中的監視窗口
(12)取消變量值跟蹤指令:undisplay 編號
需要通過變量編號刪除
(13)執行到指定行號指令:until 目標行號
如果在調試過程中循環語句要執行100次,而你又確定報錯一定不在循環中,可以until+目標行號,直接執行完循環到指定行處
(14)運行到下一個斷點處指令:continue/c
運行到下一個斷點處或直接運行結束
(15)查看當前棧各級函數調用及參數:bt
程序執行到函數時會向棧申請空間,這句代碼旨在查看當前執行到這堆棧被調用情況,以下代碼只有一個sum函數。
對應VS調試中的堆棧調用監視窗口
(16)查看當前棧幀的局部變量值:info i
也就是當前在debug下的程序信息
(17)禁用所有斷點指令:disable breakpoints
為什么禁用斷點而不直接刪除:調試過程中你可能沒有發現問題,并且程序還跑得過去可當你關閉調試,執行代碼時程序又報錯,如果你直接刪除斷點無法在之前的調試基礎上再次調試,所以禁用斷點是為了保留調試痕跡。
沒被禁用的斷點在查看時Enb下顯示y:
disable breakpoints禁用所有斷點后Enb下顯示n:
(18)啟用所有斷點指令:enable?breakpoints
以上的18點調試技巧足以讓我們進行代碼調試,有興趣的同學可以繼續了解更多其他調試語句~
三、調試技巧
(一)監視變量的變化指令:watch
在整個程序中你有定義一些靜態變量或者一些不應該修改的變量,但你懷疑它修改了導致程序報錯,你可以watch它,如果這個變量在運行過程中變了就會通知你
所以斷點的類型除了breakpoint 還有watchpoint的形式
(二)更改指定變量的值:set var
指的是在調試中你懷疑導致代碼出錯的是某個原本不可變變量值,而你此時只是猜測不想直接動源代碼改值,可以使用set var更改變量值看是否還報錯。
假設你的源碼中flag=0,你猜測要是把flag改成1可能不會再報錯,于是你使用以下語句修改flag=1,而真實的源碼還是flag=0。如果程序調試不報錯,你再去修改源碼為flag=1。
以上是gdb的基礎調試語句,看到這希望對你有幫助。