GDB
- 1. GDB調試器
- 1.1 前言
- 1.2 GDB編譯程序
- 1.3 啟動GDB
- 1.4 載入被調試程序
- 1.5 查看源碼
- 1.6 運行程序
- 1.7 斷點設置
- 1.7.1 通過行號設置斷點
- 1.7.2 通過函數名設置斷點
- 1.7.3 通過條件設置斷點
- 1.7.4 查看斷點信息
- 1.7.5 刪除斷點
- 1.8 單步調試
- 1.9
- 2. GDB調試core文件
- 2.1 設定core文件的最大值
- 2.2 臨時修改core文件的生成路徑
- 2.2.1 示例一:除數設為0
- 2.2.2 示例二:這里scanf后的參數沒有加&
- 2.3
- 2.4
1. GDB調試器
1.1 前言
GDB是GNU調試器(GNU Debugger)的縮寫,是一種功能強大的調試工具,可以用于調試多種編程語言的程序,如C、C++、匯編等。GDB可以幫助程序員在程序運行時進行調試,包括查看變量的值、跟蹤程序執行流程、設置斷點等。
GDB支持多種操作系統,包括Linux、Unix、Windows等。
1.2 GDB編譯程序
- 文件編譯
g++ main.cpp -o main - 帶有GDB debug功能,編譯
g++ -g main.cpp -o main - 查看可執行文件是否帶有debug功能
readelf -S main | grep debug
1.3 啟動GDB
1.4 載入被調試程序
1.5 查看源碼
list / l [first, last](行號)
1.6 運行程序
run / r
若程序運行時需要參數,在run命令后加上參數即可.
1.7 斷點設置
break / b 行號/函數名/條件
1.7.1 通過行號設置斷點
1.7.2 通過函數名設置斷點
1.7.3 通過條件設置斷點
當n > 1時會在OddOrEven函數中停止執行
1.7.4 查看斷點信息
info breakpoints
1.7.5 刪除斷點
delete breakpointNum
1.8 單步調試
1.9
2. GDB調試core文件
2.1 設定core文件的最大值
ulimit -c [n]
有參數n為設置,沒有參數n為查看,若core文件最大值為0則不會生成coredump
2.2 臨時修改core文件的生成路徑
echo /root/achen/project/coredump/core.%e.%p> /proc/sys/kernel/core_pattern
%e為程序名,%p為進程id
2.2.1 示例一:除數設為0
編譯后運行,并將除數設為0
提示核心已轉儲(coredump),查看coredump目錄下,生成了core文件
使用GDB對core進行調試
core-file core文件
這里提示信號終止了程序,發成了arithmetic異常(由于除數為0)
查看函數的調用棧幀和層級關系
backtrace / bt
這里和上面core-file都有一串問號,原因是沒加載符號表,解決方案為在core-file之前先載入被調試程序
調用bt命令
結果為函數調用的棧幀和層級關系,因為該程序中沒有函數調用,所以只有顯示main函數,且錯誤行數為第9行
2.2.2 示例二:這里scanf后的參數沒有加&
這里scanf后的參數沒有加&
編譯后運行
發生coredump,查看coredump目錄,生成了core文件
使用GDB進行調試
這里顯示信號終止了服務,發生了段錯誤
查看棧幀和層級關系發現函數調用關系為main->scanf->_IO_vfscanf,函數錯誤為第6行