gdb 調試工具 --- 使用方法淺析

gdb 調試工具使用方法淺析

1. 什麼是gdb

gdb是GNU debugger的縮寫,是編程調試工具。

2. gdb的功能

  • 啓動程序,可以按照用戶自定義的要求隨心所欲的運行程序。
  • 可讓被調試的程序在用戶所指定的調試斷點處停住(斷點可以是條件表達式)。
  • 當程序停住時,可以檢查此時程序中所發生的事。比如,可以打印變量的值。
  • 動態改變變量程序的執行環境。

3. gdb的使用

  1. 運行程序
    • run(r)運行程序,如果要加參數,則是run arg1 arg2 ...
  2. 查看源代碼
    • list(l):查看最近十行源碼
    • list fun:查看fun函數源代碼
    • list file:fun:查看flie文件中的fun函數源代碼
  3. 設置斷點與觀察斷點
    • break 行號/fun設置斷點。
    • break file:行號/fun設置斷點。
    • break if<condition>:條件成立時程序停住。
    • info break(縮寫:i b):查看斷點。
    • watch expr:一旦expr值發生改變,程序停住。
    • delete n:刪除斷點。
  4. 單步調試
    • continue(c):運行至下一個斷點。
    • step(s):單步跟蹤,進入函數,類似於VC中的step in
    • next(n):單步跟蹤,不進入函數,類似於VC中的step out
    • finish:運行程序,知道當前函數完成返回,並打印函數返回時的堆棧地址和返回值及參數值等信息。
    • until:當厭倦了在一個循環體內單步跟蹤時,這個命令可以運行程序知道退出循環體。
  5. 查看運行時數據
    • print(p):查看運行時的變量以及表達式。
    • ptype:查看類型。
    • print array:打印數組所有元素。
    • print *array@len:查看動態內存。len是查看數組array的元素個數。
    • print x=5:改變運行時數據。

4. 程序錯誤

  • 編譯錯:編寫程序的時候沒有符合語言規範導致編譯錯誤。比如:語法錯誤。
  • 運行時錯誤:編譯器檢查不出這種錯誤,但在運行時候可能會導致程序崩潰。比如:內存地址非法訪問。
  • 邏輯錯誤:編譯和運行都很順利,但是程序沒有幹我們期望乾的事情。

5. gdb調試段錯誤

什麼是段錯誤?段錯誤是由於訪問非法地址而產生的錯誤。

  • 訪問系統數據區,尤其是往系統保護的內存地址寫數據。比如:訪問地址爲0的地址。
  • 內存越界(數組越界,變量類型不一致等)訪問到不屬於當前程序的內存區域。

gdb調試段錯誤,可以直接運行程序,當程序運行崩潰後,gdb會打印運行的信息,比如:收到了SIGSEGV信號,然後可以使用bt命令,打印棧回溯信息,然後根據程序發生錯誤的代碼,修改程序。

6. core文件調試

6.1 core文件

在程序崩潰時,一般會生成一個文件叫core文件。core文件記錄的是程序崩潰時的內存映像,並加入調試信息,core文件生成過程叫做core dump(核心已轉儲)。系統默認不會生成該文件。

6.2 設置生成core文件

  • ulimit -c:查看core-dump狀態。
  • ulimit -c xxxx:設置core文件的大小。
  • ulimit -c unlimited:core文件無限制大小。

6.3 gdb調試core文件

當設置完ulimit -c xxxx後,再次運行程序發生段錯誤,此時就會生成一個core文件,使用gdb core調試core文件,使用bt命令打印棧回溯信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章