gdb 基礎

Tadeas發表於2018-12-10

版權:https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/gdb.html

1. gdb 除錯利器

GDB是一個由GNU開源組織釋出的、UNIX/LINUX作業系統下的、基於命令列的、功能強大的程式除錯工具。 對於一名Linux下工作的c++程式設計師,gdb是必不可少的工具;

1.1. 啟動gdb

對C/C++程式的除錯,需要在編譯前就加上-g選項:

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

除錯可執行檔案:

$gdb <program>

program也就是你的執行檔案,一般在當前目錄下。

除錯core檔案(core是程式非法執行後core dump後產生的檔案):

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

除錯服務程式:

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

如果你的程式是一個服務程式,那麼你可以指定這個服務程式執行時的程式ID。gdb會自動attach上去,並除錯他。program應該在PATH環境變數中搜尋得到。

1.2. gdb互動命令

啟動gdb後,進入到互動模式,通過以下命令完成對程式的除錯;注意高頻使用的命令一般都會有縮寫,熟練使用這些縮寫命令能提高除錯的效率;

執行

  • run:簡記為 r ,其作用是執行程式,當遇到斷點後,程式會在斷點處停止執行,等待使用者輸入下一步的命令。
  • continue (簡寫c ):繼續執行,到下一個斷點處(或執行結束)
  • next:(簡寫 n),單步跟蹤程式,當遇到函式呼叫時,也不進入此函式體;此命令同 step 的主要區別是,step 遇到使用者自定義的函式,將步進到函式中去執行,而 next 則直接呼叫函式,不會進入到函式體內。
  • step (簡寫s):單步除錯如果有函式呼叫,則進入函式;與命令n不同,n是不進入呼叫的函式的
  • until:當你厭倦了在一個迴圈體內單步跟蹤時,這個命令可以執行程式直到退出迴圈體。
  • 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: 來檢視程式的是否在執行,程式號,被暫停的原因。

分割視窗

  • layout:用於分割視窗,可以一邊檢視程式碼,一邊測試:
  • layout src:顯示原始碼視窗
  • layout asm:顯示反彙編視窗
  • layout regs:顯示原始碼/反彙編和CPU暫存器視窗
  • layout split:顯示原始碼和反彙編視窗
  • Ctrl + L:重新整理視窗

相關文章