Linux C/C++開發環境和編譯除錯(二)詳細記錄如何使用GDB進行除錯
阿新 • • 發佈:2021-11-06
## 這篇部落格主要是用來記錄前些天覆習GDB除錯的過程
除錯前的準備
Linux C/C++開發環境和編譯除錯(一)
需要關閉-o,開啟-g,開啟-Wall
來看一下加入程式碼除錯資訊(-g)之後生成的可執行檔案大小和沒加的對比:
root@ziggy-virtual-machine:~/learn_gdb# gcc -g test.c -o demo1 root@ziggy-virtual-machine:~/learn_gdb# gcc test.c -o demo_g root@ziggy-virtual-machine:~/learn_gdb# ll -h demo1 demo_g -rwxr-xr-x 1 root root 10K 10月 31 12:07 demo1* -rwxr-xr-x 1 root root 8.6K 10月 31 12:08 demo_g*
GDB命令
啟動:
(1)開啟gdb除錯:
#格式:gdb [exec_filename]
#例如:
gdb demo1
退出:quit
(2)為程式設定引數/獲取設定的引數(為程式設定命令列引數,獲取引數列表)
set args 5 8
show args
如果不加-g的編譯選項,則未向可執行檔案中加入原始碼資訊,所以無法在gdb中檢視原始碼
(3)檢視程式原始碼:
#1.檢視當前檔案: list/l(預設位置顯示) list/l 行號 list/l 函式名 #2.檢視非當前檔案: list/l 檔名:行號 list/l 檔名:函式名 #3.設定顯示的行數 show list/listsize set list list/listsize 行數
如果按回車,則預設繼續輸入list,繼續顯示下面的程式碼片段
多檔案情況:
root@ziggy-virtual-machine:~/learn_gdb# g++ -o demo_multi bubble.cpp main.cpp select.cpp -g
預設顯示main函式:
如果想要看其他原始檔:使用l filename:行號
或 l filename:函式名
設定斷點
#1.設定斷點 b/break 行號 b/break 函式名 b/break 檔名:行號 b/break 檔名:函式 #2.檢視斷點 i/info b/break #3.刪除斷點 d/del/delete 斷點編號(這個編號是info查出的) #4.設定斷點效果: dis/disable 斷點編號(設定斷點無效) enable 斷點編號(設定斷點有效) #5.設定條件斷點 b/break 10 if i==5
設定條件斷點:
執行程式
start:程式停在第一行
run:遇到斷點才停
c/continue:繼續執行,直到下一個斷點
n/next:向下執行一行程式碼(不進入函式體)
s/step:但不除錯(可以進入函式體)
finish :跳出函式體
p/print 變數名:列印變數值
ptype 變數名:列印變數型別
set var 變數名=變數值
until:跳出迴圈
自動變數:
display num(自動列印指定變數的值)
i/info display
undisplay 編號
先設定斷點:b 8
再執行程式碼直到達到斷點(還未執行斷點所在的那行)
使用c,繼續執行,直到到達下一個斷點
使用n向下執行一行程式碼(不可進入函式體),使用s可進行單步除錯(可進入函式體,使用finish跳出函式體)
print不能自動在s單步除錯時自動列印所指定的變數值,但是display可以
使用display自動列印指定變數值,i display檢視已設定為自動列印的變數值,undisplay 編號用於取消某個編號的變數的自動列印,注意這裡的編號是i display中第一列的值
finish跳出函式
條件斷點:
設定變數值
len為5,我們設定i = 4,使其下一次即跳出迴圈