gdb 調試工具使用方法淺析
1. 什麼是gdb
gdb是GNU debugger的縮寫,是編程調試工具。
2. gdb的功能
- 啓動程序,可以按照用戶自定義的要求隨心所欲的運行程序。
- 可讓被調試的程序在用戶所指定的調試斷點處停住(斷點可以是條件表達式)。
- 當程序停住時,可以檢查此時程序中所發生的事。比如,可以打印變量的值。
- 動態改變變量程序的執行環境。
3. gdb的使用
- 運行程序
run(r)
運行程序,如果要加參數,則是run arg1 arg2 ...
- 查看源代碼
list(l)
:查看最近十行源碼list fun
:查看fun
函數源代碼list file:fun
:查看flie
文件中的fun
函數源代碼
- 設置斷點與觀察斷點
break 行號/fun
設置斷點。break file:行號/fun
設置斷點。break if<condition>
:條件成立時程序停住。info break(縮寫:i b)
:查看斷點。watch expr
:一旦expr
值發生改變,程序停住。delete n
:刪除斷點。
- 單步調試
continue(c)
:運行至下一個斷點。step(s)
:單步跟蹤,進入函數,類似於VC中的step in
。next(n)
:單步跟蹤,不進入函數,類似於VC中的step out
。finish
:運行程序,知道當前函數完成返回,並打印函數返回時的堆棧地址和返回值及參數值等信息。until
:當厭倦了在一個循環體內單步跟蹤時,這個命令可以運行程序知道退出循環體。
- 查看運行時數據
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
命令打印棧回溯信息。