gdb除錯

ly1390811049發表於2020-12-27

程式碼偵錯程式

避免不了,程式會出現bug,但是使用命令列編譯出錯後是沒有除錯資訊的(g++編譯時),因此我們需要使用gdb對程式進行除錯

這次主要介紹GDB指令,其他編譯方法和指令請自行上網查詢!

啟動gdb後,可以進入到互動模式,通過以下命令對程式完成除錯工作!

編譯時加上-g引數 生成符號檔案

g++ -g -std=c++11 main.cpp
gdb a.out

執行指令

run(簡寫r):
執行程式,當遇到斷點後,程式會在斷點處停止執行,等待使用者輸入下一步命令
continue(簡寫c) :
繼續執行,到下一個斷點停止(或執行結束)
next(簡寫n) : 單步步過
單步跟蹤程式,當遇到函式呼叫時,也不進入此函式體;此命令同 step 的主要區別是,step 遇到使用者自定義的函式,將步進到函式中去執行,而 next 則直接呼叫函式,不會進入到函式體內。
step (簡寫s): 單步步入
單步除錯如果有函式呼叫,則進入函式;與命令n不同,n是不進入呼叫的函式的
until(簡寫u):
當你厭倦了在一個迴圈體內單步跟蹤時,這個命令可以執行程式直到退出迴圈體。
until+行號:
執行至某行,不僅僅用來跳出迴圈
finish:
執行程式,直到當前函式完成返回,並列印函式返回時的堆疊地址和返回值及引數值等資訊。
call 函式(引數):
呼叫程式中可見的函式,並傳遞“引數”,如:call gdb_test(55)
quit(簡寫q) :
退出gdb

設定斷點:

break n (簡寫b n):
在第n行處設定斷點(可以帶上程式碼路徑和程式碼名稱: b OAGUPDATE.cpp:578)
b fn1 if a>b:
條件斷點設定
break func(break縮寫為b):
在函式func()的入口處設定斷點,如:break cb_button
delete 斷點號n:
刪除第n個斷點
disable 斷點號n:
暫停第n個斷點
enable 斷點號n:
開啟第n個斷點
clear 行號n:
清除第n行的斷點
info b (info breakpoints) :
顯示當前程式的斷點設定情況
delete breakpoints:
清除所有斷點:

檢視原始碼:

list :
簡記為 l ,其作用就是列出程式的原始碼,預設每次顯示10行。
list 行號:
將顯示當前檔案以“行號”為中心的前後10行程式碼,如:list 12
list 函式名:
將顯示“函式名”所在函式的原始碼,如:list main
list :
加粗樣式帶引數,將接著上一次 list 命令的,輸出下邊的內容。

列印表示式

print 表示式(簡記p):
其中“表示式”可以是任何當前正在被測試程式的有效表示式,比如當前正在除錯C語言的程式,那麼“表示式”可以是任何C語言的有效表示式,包括數字,變數甚至是函式呼叫。
print a:
將顯示整數 a 的值
print ++a:
將把 a 中的值加1,並顯示出來
print name:
將顯示字串 name 的值
print gdb_test(22):
將以整數22作為引數呼叫 gdb_test() 函式
print gdb_test(a):
將以變數 a 作為引數呼叫 gdb_test() 函式
display 表示式:
在單步執行時將非常有用,使用display命令設定一個表示式後,它將在每次單步進行指令後,緊接著輸出被設定的表示式及值。如: display a
watch 表示式:
設定一個監視點,一旦被監視的“表示式”的值改變,gdb將強行終止正在被除錯的程式。如: watch a
whatis :
查詢變數或函式
info function:
查詢函式
擴充套件info locals:
顯示當前堆疊頁的所有變數

查詢執行資訊

where/bt :
當前執行的堆疊列表;
bt backtrace
顯示當前呼叫堆疊
up/down
改變堆疊顯示的深度
set args 引數:
指定執行時的引數
show args:
檢視設定好的引數
info program:
來檢視程式的是否在執行,程式號,被暫停的原因。

相關文章