鍍金池/ 教程/ Linux/ gdb 調(diào)試利器
進程管理工具
objdump 二進制文件分析
scp 跨機遠程拷貝
crontab 定時任務
readelf elf文件格式分析
pstack 跟蹤進程棧
系統(tǒng)管理及IPC資源管理
vmstat 監(jiān)視內(nèi)存使用情況
strace 跟蹤進程中的系統(tǒng)調(diào)用
sar 找出系統(tǒng)瓶頸的利器
ipcs 查詢進程間通信狀態(tài)
ps 進程查看器
性能優(yōu)化
wget 文件下載
top linux下的任務管理器
磁盤管理
size 查看程序內(nèi)存映像大小
free 查詢可用內(nèi)存
文件及目錄管理
iostat 監(jiān)視I/O子系統(tǒng)
性能監(jiān)控
程序構(gòu)建
學會使用命令幫助
gdb 調(diào)試利器
網(wǎng)絡工具
nm 目標文件格式分析
lsof 一切皆文件
用戶管理工具
程序調(diào)試
ldd 查看程序依賴庫
文本處理

gdb 調(diào)試利器

GDB是一個由GNU開源組織發(fā)布的、UNIX/LINUX操作系統(tǒng)下的、基于命令行的、功能強大的程序調(diào)試工具。 對于一名Linux下工作的c++程序員,gdb是必不可少的工具;

啟動gdb

對C/C++程序的調(diào)試,需要在編譯前就加上-g選項::

$g++ -g hello.cpp -o hello

調(diào)試可執(zhí)行文件::

$gdb <program>

program也就是你的執(zhí)行文件,一般在當前目錄下。

調(diào)試core文件(core是程序非法執(zhí)行后core dump后產(chǎn)生的文件)::

$gdb <program> <core dump file>
$gdb program core.11127

調(diào)試服務程序::

$gdb <program> <PID>
$gdb hello 11127

如果你的程序是一個服務程序,那么你可以指定這個服務程序運行時的進程ID。gdb會自動attach上去,并調(diào)試他。program應該在PATH環(huán)境變量中搜索得到。

gdb交互命令

啟動gdb后,進入到交互模式,通過以下命令完成對程序的調(diào)試;注意高頻使用的命令一般都會有縮寫,熟練使用這些縮寫命令能提高調(diào)試的效率;

運行

  • run:簡記為 r ,其作用是運行程序,當遇到斷點后,程序會在斷點處停止運行,等待用戶輸入下一步的命令。
  • continue (簡寫c ):繼續(xù)執(zhí)行,到下一個斷點處(或運行結(jié)束)
  • next:(簡寫 n),單步跟蹤程序,當遇到函數(shù)調(diào)用時,也不進入此函數(shù)體;此命令同 step 的主要區(qū)別是,step 遇到用戶自定義的函數(shù),將步進到函數(shù)中去運行,而 next 則直接調(diào)用函數(shù),不會進入到函數(shù)體內(nèi)。
  • step (簡寫s):單步調(diào)試如果有函數(shù)調(diào)用,則進入函數(shù);與命令n不同,n是不進入調(diào)用的函數(shù)的
  • until:當你厭倦了在一個循環(huán)體內(nèi)單步跟蹤時,這個命令可以運行程序直到退出循環(huán)體。
  • until+行號: 運行至某行,不僅僅用來跳出循環(huán)
  • finish: 運行程序,直到當前函數(shù)完成返回,并打印函數(shù)返回時的堆棧地址和返回值及參數(shù)值等信息。
  • call 函數(shù)(參數(shù)):調(diào)用程序中可見的函數(shù),并傳遞“參數(shù)”,如: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):在函數(shù)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 函數(shù)名:將顯示“函數(shù)名”所在函數(shù)的源代碼,如:list main
  • list :不帶參數(shù),將接著上一次 list 命令的,輸出下邊的內(nèi)容。

打印表達式

  • print 表達式:簡記為 p ,其中“表達式”可以是任何當前正在被測試程序的有效表達式,比如當前正在調(diào)試C語言的程序,那么“表達式”可以是任何C語言的有效表達式,包括數(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 表達式:在單步運行時將非常有用,使用display命令設置一個表達式后,它將在每次單步進行指令后,緊接著輸出被設置的表達式及值。如: display a
  • watch 表達式:設置一個監(jiān)視點,一旦被監(jiān)視的“表達式”的值改變,gdb將強行終止正在被調(diào)試的程序。如: watch a
  • whatis :查詢變量或函數(shù)
  • info function: 查詢函數(shù)
  • 擴展info locals: 顯示當前堆棧頁的所有變量

查詢運行信息

  • where/bt :當前運行的堆棧列表;
  • bt backtrace 顯示當前調(diào)用堆棧
  • up/down 改變堆棧顯示的深度
  • set args 參數(shù):指定運行時的參數(shù)
  • show args:查看設置好的參數(shù)
  • info program: 來查看程序的是否在運行,進程號,被暫停的原因。

分割窗口

  • layout:用于分割窗口,可以一邊查看代碼,一邊測試:
  • layout src:顯示源代碼窗口
  • layout asm:顯示反匯編窗口
  • layout regs:顯示源代碼/反匯編和CPU寄存器窗口
  • layout split:顯示源代碼和反匯編窗口
  • Ctrl + L:刷新窗口

交互模式下直接回車的作用是重復上一指令,對于單步調(diào)試非常方便;

更強大的工具

cgdb

cgdb可以看作gdb的界面增強版,用來替代gdb的 gdb -tui。cgdb主要功能是在調(diào)試時進行代碼的同步顯示,這無疑增加了調(diào)試的方便性,提高了調(diào)試效率。界面類似vi,符合unix/linux下開發(fā)人員習慣;如果熟悉gdb和vi,幾乎可以立即使用cgdb。