歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> 關於Unix >> 讓錯誤無處遁形gdb排錯工具基本用法

讓錯誤無處遁形gdb排錯工具基本用法

日期:2017/3/6 15:47:35   编辑:關於Unix
當程序出錯並產生core 時快速定位出錯函數的辦法,gdb 程序名 core文件名(一般是core,也可能是core.xxxx) 調試程序使用的鍵 r run 運行.程序還沒有運行前使用 c cuntinue 繼續運行。運行中斷後繼續運行 q 退出 kill 終止調試的程序 h help 幫助 命令補全功能
  當程序出錯並產生core 時快速定位出錯函數的辦法,gdb 程序名 core文件名(一般是core,也可能是core.xxxx)
  
  調試程序使用的鍵
  r run 運行.程序還沒有運行前使用
  c cuntinue 繼續運行。運行中斷後繼續運行
  q 退出
  kill 終止調試的程序
  h help 幫助
   命令補全功能
  
  step 跟入函數
  next 不跟入函數
  b breakpoint 設置斷點。
  
  用法:
  b 函數名 對此函數進行中斷
  b 文件名:行號 對此文件中指定行中斷.如果是當前文件,那麼文件名與:號可以省略
  看當前斷點數使用info break.禁止斷點disable 斷點號.刪除delete 斷點號.
  
  l list 列出代碼行。一次列10 行。連接使用list將會滾動顯示. 也可以在list 後面跟上 文件名:行號watch 觀察一個變量的值。每次中斷時都會顯示這個變量的值p print 打印一個變量的值。與watch不同的是print只顯示一次這裡在順便說說如何改變一個 value. 當你下指令 p 的時候,例如你用 p b,這時候你會看到 b 的 value, 也就是上面的 $1 = 15.你也同樣可以用 p 來改變一個 value, 例如下指令 p b = 100 試試看,這時候你會發現, b 的 value 就變成 100 了:$1 = 100.
  
  網上抄錄
  基本的使用方法簡介
  
  前言
  程序代碼中的錯誤可分為數類,除了最容易除錯的語法錯誤,編譯程序會告訴你錯誤所在外,大部分的錯誤都可以歸類為執行時錯誤。GDB 的功能便是尋找執行時錯誤。如果沒有除錯程序,我們只能在程序中加入輸出變量值的指令來了解程序執行的狀態。有了 GDB 除錯程序,我們可以設定在任何地方停止程序的執行,然後可以隨意檢視變量值及更動變量,並逐行執行程序。一個除錯程序執行的流程通常是這樣的:
  
  1. 進入除錯程序並指定可執行文件。
  2. 指定程序代碼所在目錄。
  3. 設定斷點後執行程序。
  4. 程序於斷點中斷後,可以 (1)檢視程序執行狀態;檢視變量值或變更變量值 (2) 逐步執行程序,或是全速執行程序到下一個斷點或是到程序結束為止。
  5. 離開除錯程序。
  以下將分為下列數項分別介紹:
  1. 進入 GDB 及指定可執行檔
  2. 指定程序代碼所在目錄及檢視程序代碼
  3. 斷點的設定與清除
  4. 全速及逐步執行程序
  5. 檢視及更改變量值
  6. 檢視程序執行狀態
  7. 讀取 Core 文件信息
  進入 GDB 及指定可執行檔:
  1. 進入 GDB 並讀入可執行檔 (檔名為 'PROGRAM'),准備進行除錯。
  gdb PROGRAM
  指定程序代碼所在目錄及檢視程序代碼
  1. 增加目錄 DIR 到收尋程序代碼的目錄列表 (如果你的程序代碼和可執行檔放在同一個目錄下,就不須指定程序代碼所在目錄。):
  (gdb) directory DIR
  
  2. 檢視程序代碼,格式計有:
  (gdb) list => 顯示目前執行程序代碼前後各五行的程序代碼;或是顯示從上次 list 之後的程序代碼
  (gdb) list function => 顯示該程序開始處前後五行的程序代碼。
  (gdb) list - =>上次顯示程序代碼的前面的十行。
  
  斷點的設定與清除
  1. 設定斷點(指令為 break,可簡寫為 (b),格式計有:
  (gdb) break filename.c:30 => 在 filename.c 的第三十行處停止執行。
  (gdb) break function => 在進入 function 時中斷程序的執行。
  (gdb) break filename.c:function => 在程序代碼檔 filename.c 中的函數 function 處設定斷點。
  (gdb) break => 在下一個將被執行的命令設定斷點。
  (gdb) break ... if cond => 只有當 cond 成立的時候才中斷。cond 須以 C 語言的語法寫成。
  
  2. 顯示各個斷點的信息。
  (gdb) info break
  
  3. 清除斷點(命令為 clear),格式同 break 。例如 :
  (gdb) clear filename.c:30
  
  4. 清除斷點,NUM 是在 info break 顯示出來的斷點編號。
  (gdb) delete NUM
  全速及逐步執行程序
  1. 從程序開頭全速執行程序,直到遇到斷點或是程序執行完畢為止。
  (gdb) run
  
  2. 在程序被中斷後,全速執行程序到下一個斷點或是程序結束為止 (continue 指令可簡寫為 c)。
  (gdb) continue
  
  3. 執行一行程序. 若呼叫函數, 則將該包含該函數程序代碼視為一行程序 (next 指令可簡寫為 n)。
  (gdb) next
  
  4. 執行一行程序. 若呼叫函數, 則進入函數逐行執行 (step 指令可簡寫為 s)。
  (gdb) step
  
  5. 執行一行程序,若此時程序是在 for/while/do loop 循環的最後一行,則一直執行到循環結束後的第一行程序後停止 (until 指令可簡寫為 u)。
  (gdb) until
  
  6. 執行現行程序到回到上一層程序為止。
  (gdb) finish
  檢視及更改變量值
  1. print 敘述,顯示該敘述執行的結果 (print 指令可簡寫為 p)。如
  (gdb) print a => 顯示 a 變量的內容.
  (gdb) print sizeof(a) => 顯示 a 變量的長度.
  
  2. display 敘述,在每個斷點或是每執行一步時顯示該敘述值。如
  (gdb) display a
  
  3. 更改變量值:
  (gdb) print (a=10) => 將變量 a 的值設定為 10.
  
  檢視程序執行狀態
  1. 查看程序執行到此時,是經過哪些函數呼叫的程序 (backtrace 指令可簡寫為 bt),也就是查看函數呼叫堆棧。
  (gdb) backtrace
  讀取 Core 文件信息
  1. 讀入 PROGRAM 及 PROGRAM.CORE 檔,可檢視 Core Dump 時程序變量值及程序流程狀態 。
  gdb PROGRAM core
  說明:'core' 檔案是由 PROGRAM 檔執行後,遇到 Core Dump 時產生的 Core 檔檔名。如果你還需要該 Core 檔,我們建議你將該檔案檔名更改為 PROGRAM.core。在輸入上述命令後,你可以用 GDB 提供的檢視變量值以及檢視程序執行狀態來讀取程序 Core Dump 時的狀態。
  
  補充一點兒
  (最近我剛在用gdb,感覺還不錯,不過有的時候還是眼睛加printf更好
  使)
  我更多是用gdb直接調試程序,而不是core
  
  gdb 可執行文件名 (進入gdb環境)
  
  set ags -? (設置參數,即向你要調試的程序傳參)
  
  另外,用break functionName 和break lineNum都可以設置斷點用info break 可以查看當前斷點的信息用clear清除斷點的時候要和break相對應如果是用functionName設置的斷點就只能 clear functionName用lineNum設置的斷點就只能用clear lineNum
  
  BTW:可以到www.sunfreeware.com去下載gdb
  
  以上是我近幾天學習gdb的一點經驗,都是我犯過錯誤的地方希望對與我等同類的gdb菜鳥們有所幫助。
  
  如果是剛開始時也可以使用ddd圖形化的
  
  另外對於斷點可以使用delete 斷點號刪除斷點號可以使用info break 得到
  
  我也說說我的體會:
  r (程序運行的參數) 可以設置運行時的參數shell 運行shell環境的東西,比如shell make,完了以後直接r重新啟動程序,就可以帶上次已經加過的參數運行,不用再敲參數了
  b 文件名:行號 有的時候很有用,嘿嘿
  info b 看斷點信息
  disable 斷點號 暫停某個斷點
  enable 斷點號 啟動某個斷點
  delete (斷點號) 刪除某個斷點,不帶斷點號,全部刪除
  x/32uxb 指針 以16進制顯示該指針指向的32個字節的數據
  
  不過我還是不會用core調試.
  

Copyright © Linux教程網 All Rights Reserved