2021-05-12 14:32:11
GDB 偵錯工具使用方法詳解
2020-06-16 16:56:01
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
命令列印棧回溯資訊。
強大的C/C++ 程式偵錯工具GDB http://www.linuxidc.com/Linux/2016-09/135171.htm
Linux GDB偵錯 詳述 http://www.linuxidc.com/Linux/2016-11/137505.htm
GDB偵錯命令 http://www.linuxidc.com/Linux/2017-01/139028.htm
使用GDB命令列偵錯程式偵錯C/C++程式 http://www.linuxidc.com/Linux/2014-11/109845.htm
GDB偵錯命令總結 http://www.linuxidc.com/Linux/2016-08/133988.htm
GDB偵錯工具入門 http://www.linuxidc.com/Linux/2016-09/135168.htm
相關文章