淺談GDB調試在信息學競賽中的應用

前言:如果電腦上還沒有裝GDB,戳這裏=博客鏈接

這篇博客僅介紹一些常用的GDB指令

在這篇博文中,我們用一個求最大公約數的程序來做示範

準備步驟:


1.保存好程序 (這裏記爲1.cpp)

這裏寫圖片描述


2.打開終端 找到1.cpp所在的文件夾 ( 代碼如下)

cd desktop/OI/work //路徑可自己更改

這裏寫圖片描述


3.編譯程序(代碼如下)

g++ -o 1 1.cpp -g //格式爲 g++ -o 文件名 文件名.cpp -g

這裏寫圖片描述


4.打開GDB(然後會冒出來一大堆英文,當看到done就說明完成了初始化

gdb 1 // 格式爲 gdb 文件名

這裏寫圖片描述


開始調試:

下面來學習一些簡單有用的指令:


運行


1.r 運行程序。 按回車後輸入數據( 這裏我們用 12 , 16 )

這裏寫圖片描述


2.r < infile r > outfile 重定向輸入輸出

可以代替freopen,用法與freopen差不多

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述
這裏寫圖片描述


2.l 查看源碼(10行)

這裏寫圖片描述

l func 顯示func函數的源碼

l 顯示前面的代碼

l - 顯示前面的代碼

set listsize n 設定一次打印n行

show listsize 顯示一次打印的行數


3.Control+x+a 打開GDBGUI界面,更方便地調試/查看源碼

這裏寫圖片描述

當輸入r後會顯示源代碼

這裏寫圖片描述


斷點


1.b 7 給某一行設置斷點( 格式爲 b 行號)

這裏寫圖片描述


2.b gcd 給某個函數設置斷點

這裏寫圖片描述


3.info b 查詢斷點

這裏寫圖片描述


4.watch a 觀察點 觀察變量/表達式的值

這裏寫圖片描述

當觀察的變量或表達式的值發生改變時,程序就會停止。

在使用watch時步驟如下:
1. 使用break在要觀察的變量所在處設置斷電;
2. 使用run執行,直到斷點;
3. 使用watch設置觀察點;
4. 使用continue觀察設置的觀察點是否有變化。


5.info watchpoints 列出所有觀察點

這裏寫圖片描述


6.b 4 if b!=0 條件斷點 ( b … if ….. )

這裏寫圖片描述


7.clear 4 刪除斷點 ( clear/delet 行數/函數 )

這裏寫圖片描述

delet用於刪除所有斷點

這裏寫圖片描述


8.commands 爲斷點設定命令

格式:

設定斷點
commands
命令
end

這裏寫圖片描述

在每個斷點都輸出a,b的值

這裏寫圖片描述


簡單調試命令


1.n 單步跟蹤. (遇到斷點後繼續執行)

這裏寫圖片描述


2.s 單步跟蹤. (函數調進入被調用函數體內)

這裏寫圖片描述


3.f 退出函數

這裏寫圖片描述


4.u 在一個循環體內單步跟蹤時,這個命令可以運行程序直到退出循環。

這裏寫圖片描述


5.c繼續運行程序

這裏寫圖片描述


6.info program來查看程序的是否在運行,進程號,被暫停的原因。

這裏寫圖片描述



查看運行時數據


1.printf "%d", a 打印變量或表達式的值

這裏寫圖片描述


2.p a 打印變量或表達式的值

這裏寫圖片描述

如果要打印數組, p *array@len array爲數組名, len爲數組長


自動顯示

1.display a 自動顯示變量

這裏寫圖片描述


2.info display 查詢自動顯示的變量

這裏寫圖片描述


3.undisplay num delet num 讓自動顯示失效 num爲編號

這裏寫圖片描述


4.disable display num 讓自動顯示失效

enable display num 讓自動顯示恢復

這裏寫圖片描述
這裏寫圖片描述



1.bt 打印當前的函數調用棧的所有信息

bt-n 表示打印n層的信息

這裏寫圖片描述

這個圖表示調用順序爲 main() -> gcd( 12, 16 )

2.f 打印當前棧的信息

這裏寫圖片描述

f n 打印第n層的棧的信息

這裏寫圖片描述

info args 打印當前函數參數名及其值

這裏寫圖片描述

info locals 打印當前函數所有局部變量及其值

這裏寫圖片描述


改變程序的運行


1.print a=x修改變量的值並打印 ( a爲變量名,x爲值 )

這裏寫圖片描述

set var a=x 修改變量的值

這裏寫圖片描述


2.whatis a查詢變量類型

這裏寫圖片描述


3.jump n 跳轉到指定行

這裏寫圖片描述


4.return n 強制返回

return (無返回值)

這裏寫圖片描述


5.print gcd(10,16) 強制調用函數

這裏寫圖片描述

cal gcd(10,16) 如果返回值是void,則不顯示

這裏寫圖片描述


參考文獻:
www.cnblogs.com/lonelycatcher/archive/2011/10/09/2204865.html
www.cnblogs.com/ggjucheng/archive/2011/12/14/2288004.html#_Toc311658066
blog.csdn.net/u013982161/article/details/53150579
www.cnblogs.com/chengliangsheng/p/3597010.html

發佈了190 篇原創文章 · 獲贊 19 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章