1. 程式人生 > 其它 >Linux C/C++開發環境和編譯除錯(二)詳細記錄如何使用GDB進行除錯

Linux C/C++開發環境和編譯除錯(二)詳細記錄如何使用GDB進行除錯

## 這篇部落格主要是用來記錄前些天覆習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,使其下一次即跳出迴圈

學習的時候喜歡用Markdown做記錄,存貨已經堆滿檔案夾了