一、gdb基本使用
GDB是一個由GNU開源組織發布的、UNIX/LINUX操作系統下的、基於命令行的、功能強大的程序調試工具。 對於一名Linux下工作的c++程序員,gdb是必不可少的工具;
1. 啟動gdb
對於C/C++程序,編譯的時候需要加上 -g
參數生成調試信息。如:gcc -g hello.c -o hello
-
調試可執行程序
$gdb 程序名稱 $gdb ./hello # 調試當前目錄下名稱為hello的程序
-
調試服務程序
$gdb 程序名稱 進程pid $gdb hello 5678 # 調試當前目錄下名稱為hello,進程pid為5678的程序
-
調試core文件(程序崩潰后生成的core dump 文件)
$gdb 程序名稱 core文件名稱 $gdb hello core.0609 # 調試當前目錄下名稱為hello,core文件名稱為core.0609的程序
2. gdb交互式命令
啟動gdb后,進入到交互模式,通過以下命令完成對程序的調試;高頻使用的命令一般都會有縮寫,熟練使用這些縮寫命令能提高調試的效率;
運行
run:縮寫為 r
,運行程序,當遇到斷點后停止,程序會在斷點處停止運行,等待用戶輸入下一步的命令,類似於vs中的 F5。continue: 縮寫為 c
,繼續執行,到下一個斷點(沒有斷點就運行到程序結束)。step: 縮寫為 s
,單步調試如果遇到函數則進入函數;與命令n
不同,n是不盡然調用的函數的,step 相當於vs的 F11。next:縮寫為 n
,單步跟蹤程序,當遇到調用函數時不進入函數;此命令與step的主要區別是,step 遇到用戶自定義的函數,進步入到函數中運行,而 next 則是直接調用函數,不會進入到函數內,next 相當於vs的 F10。until
: 當進入到循環中時,使用until命令可以使程序直接運行到退出循環體。until+行號
:運行至指定行,不僅僅用來跳出循環。finish
: 運行程序,知道當前函數返回,並打印函數返回時的堆棧地址和返回值及參數值等信息。call 函數(參數)
: 調用程序中的函數,並傳遞“參數”,如:call add(3,2)
quit: 縮寫為q
,退出gdb。
設置斷點
gdb使用break(縮寫為 b)
來設置斷點,具體使用如下:
break n
(簡寫 b n),在第 n 行處設置斷點(可以寫上代碼路徑和文件名稱,如b ./test.cpp:10
)b fn1 if a>b
,設置條件斷點。b func
,在函數func()入口處設置斷點。info b (info breakpoints)
顯示當前程序的斷點設置情況和斷點的斷點號等信息。disable 斷點號n
, 禁用第n個斷點。enable 斷點號n
,啟用第n個斷點。delete 斷點號n
,刪除第n個斷點。delete breakpoints
,清除所有斷點。
查看源代碼
list 簡記為 l
: 列出程序的源代碼,默認每次顯示10行。list 行號
:將顯示當前文件以“行號”為中心的前后10行代碼,如:list 12list 函數名
:將顯示“函數名”所在函數的源代碼,如:list mainlist
:不帶參數,將接着上一次 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
: 來查看程序的是否在運行,進程號,被暫停的原因。
分割窗口
-
layout
:用於分割窗口,可以一邊查看代碼,一邊測試: -
layout src
:顯示源代碼窗口 -
layout asm
:顯示反匯編窗口 -
layout regs
:顯示源代碼/反匯編和CPU寄存器窗口 -
layout split
:顯示源代碼和反匯編窗口 -
Ctrl + L
:刷新窗口