gdb 调试利器
1. gdb 調(diào)試?yán)?/span>
GDB是一個由GNU開源組織公布的、UNIX/LINUX操作系統(tǒng)下的、基于命令行的、功能強大的程序調(diào)試工具。對于一名Linux下工作的c++程序猿,gdb是不可缺少的工具;
1.1. 啟動gdb
對C/C++程序的調(diào)試。須要在編譯前就加上-g選項:
$g++ -g hello.cpp -o hello調(diào)試可運行文件:
$gdb <program>program也就是你的運行文件。一般在當(dāng)前文件夾下。
調(diào)試core文件(core是程序非法運行后core dump后產(chǎn)生的文件):
$gdb <program> <core dump file> $gdb program core.11127調(diào)試服務(wù)程序:
$gdb <program> <PID> $gdb hello 11127假設(shè)你的程序是一個服務(wù)程序,那么你能夠指定這個服務(wù)程序執(zhí)行時的進(jìn)程ID。
gdb會自己主動attach上去,并調(diào)試他。program應(yīng)該在PATH環(huán)境變量中搜索得到。
1.2. gdb交互命令
啟動gdb后,進(jìn)入到交互模式,通過下面命令完畢對程序的調(diào)試。注意高頻使用的命令一般都會有縮寫,熟練使用這些縮寫命令能提高調(diào)試的效率;
執(zhí)行
- run:簡記為 r 。其作用是執(zhí)行程序,當(dāng)遇到斷點后,程序會在斷點處停止執(zhí)行,等待用戶輸入下一步的命令。
- continue (簡寫c ):繼續(xù)執(zhí)行,到下一個斷點處(或執(zhí)行結(jié)束)
- next:(簡寫 n),單步跟蹤程序。當(dāng)遇到函數(shù)調(diào)用時,也不進(jìn)入此函數(shù)體。此命令同 step 的主要差別是,step 遇到用戶自己定義的函數(shù),將步進(jìn)到函數(shù)中去執(zhí)行,而 next 則直接調(diào)用函數(shù),不會進(jìn)入到函數(shù)體內(nèi)。
- step (簡寫s):單步調(diào)試假設(shè)有函數(shù)調(diào)用。則進(jìn)入函數(shù);與命令n不同,n是不進(jìn)入調(diào)用的函數(shù)的
- until:當(dāng)你厭倦了在一個循環(huán)體內(nèi)單步跟蹤時。這個命令能夠執(zhí)行程序直到退出循環(huán)體。
- until+行號: 執(zhí)行至某行,不只用來跳出循環(huán)
- finish: 執(zhí)行程序,直到當(dāng)前函數(shù)完畢返回,并打印函數(shù)返回時的堆棧地址和返回值及參數(shù)值等信息。
- call 函數(shù)(參數(shù)):調(diào)用程序中可見的函數(shù)。并傳遞“參數(shù)”,如:call gdb_test(55)
- quit:簡記為 q ,退出gdb
設(shè)置斷點
- break n (簡寫b n):在第n行處設(shè)置斷點
(能夠帶上代碼路徑和代碼名稱: b OAGUPDATE.cpp:578)
-
b fn1 if a>b:條件斷點設(shè)置
-
break func(break縮寫為b):在函數(shù)func()的入口處設(shè)置斷點。如:break cb_button
-
delete 斷點號n:刪除第n個斷點
-
disable 斷點號n:暫停第n個斷點
-
enable 斷點號n:開啟第n個斷點
-
clear 行號n:清除第n行的斷點
-
info b (info breakpoints) :顯示當(dāng)前程序的斷點設(shè)置情況
-
delete breakpoints:清除全部斷點:
查看源碼
- list :簡記為 l ,其作用就是列出程序的源碼,默認(rèn)每次顯示10行。
- list 行號:將顯示當(dāng)前文件以“行號”為中心的前后10行代碼,如:list 12
- list 函數(shù)名:將顯示“函數(shù)名”所在函數(shù)的源碼。如:list main
- list :不帶參數(shù),將接著上一次 list 命令的,輸出下邊的內(nèi)容。
打印表達(dá)式
- print 表達(dá)式:簡記為 p 。當(dāng)中“表達(dá)式”能夠是不論什么當(dāng)前正在被測試程序的有效表達(dá)式,比方當(dāng)前正在調(diào)試C語言的程序。那么“表達(dá)式”能夠是不論什么C語言的有效表達(dá)式,包含數(shù)字。變量甚至是函數(shù)調(diào)用。
- print a:將顯示整數(shù) a 的值
- print ++a:將把 a 中的值加1,并顯示出來
- print name:將顯示字符串 name 的值
- print gdb_test(22):將以整數(shù)22作為參數(shù)調(diào)用 gdb_test() 函數(shù)
- print gdb_test(a):將以變量 a 作為參數(shù)調(diào)用 gdb_test() 函數(shù)
- display 表達(dá)式:在單步執(zhí)行時將很實用,使用display命令設(shè)置一個表達(dá)式后,它將在每次單步進(jìn)行指令后,緊接著輸出被設(shè)置的表達(dá)式及值。如: display a
- watch 表達(dá)式:設(shè)置一個監(jiān)視點。一旦被監(jiān)視的“表達(dá)式”的值改變,gdb將強行終止正在被調(diào)試的程序。
如: watch a
- whatis :查詢變量或函數(shù)
- info function: 查詢函數(shù)
- 擴展info locals: 顯示當(dāng)前堆棧頁的全部變量
查詢執(zhí)行信息
- where/bt :當(dāng)前執(zhí)行的堆棧列表;
- bt backtrace 顯示當(dāng)前調(diào)用堆棧
- up/down 改變堆棧顯示的深度
- set args 參數(shù):指定執(zhí)行時的參數(shù)
- show args:查看設(shè)置好的參數(shù)
- info program: 來查看程序的是否在執(zhí)行,進(jìn)程號,被暫停的原因。
切割窗體
- layout:用于切割窗體。能夠一邊查看代碼,一邊測試:
- layout src:顯示源碼窗體
- layout asm:顯示反匯編窗體
- layout regs:顯示源碼/反匯編和CPU寄存器窗體
- layout split:顯示源碼和反匯編窗體
- Ctrl + L:刷新窗體
注解
交互模式下直接回車的作用是反復(fù)上一指令。對于單步調(diào)試很方便。
1.3. 更強大的工具
cgdb
cgdb能夠看作gdb的界面增強版,用來替代gdb的 gdb -tui。cgdb主要功能是在調(diào)試時進(jìn)行代碼的同步顯示,這無疑添加了調(diào)試的方便性,提高了調(diào)試效率。界面類似vi,符合unix/linux下開發(fā)者習(xí)慣;假設(shè)熟悉gdb和vi,差點兒能夠馬上使用cgdb。
轉(zhuǎn)載于:https://www.cnblogs.com/jhcelue/p/6886105.html
總結(jié)
- 上一篇: 第二阶段冲刺 第六天
- 下一篇: ionic环境搭建