91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何進行C程序調試與GDB入門

發布時間:2021-11-17 09:16:35 來源:億速云 閱讀:172 作者:柒染 欄目:大數據

本篇文章為大家展示了如何進行C程序調試與GDB入門,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

1、Assert

引用自<assert.h>的函數assert(int expression),當表達式的值為0則返回failed

2、GDB

gdb是GUN的提供在unix上的調試工具。

安裝sudo apt install gdb

如果是windows,則尋找對應的exe安裝即可,同時需要配置環境變量

2.1 使用流程

# 編譯,得到executable程序
# -g指令會列出行號、注釋信息
gcc -g -o executable one.c two.c other.c 

# gdb調試
gdb executable

# 指定某行打斷點,或者指定某個函數為斷點
break one:17
break main

#運行
run [args]

# 顯示待驗證的變量值,此后每次停下來都會顯示這些變量值
display var1
display var2

# 快進到下一個斷點/或者運行到結尾
continue

# 退出
quit

2.2 斷點和條件中斷

著重說一下斷點的標識和查詢。

怎么打斷點

# 直接在函數上打斷點
break <function_name>

# 作用在指定行上,如果是多文件,可以使用filename指定特定的源文件
break <filename>:line_num

斷點信息查詢以及斷點的刪除、禁用等

# 查詢全部的斷點,顯示信息的第一列是每一個斷點id
info breakpoints

#刪除斷點
delete break_id

# 禁用斷點
disable break_id

#重啟被禁用的斷點
enable break_id

#忽略斷點times次
#也就意味著,在運行到斷點times次以后,斷點會再次生效
ignore break_id times

條件中斷

條件中斷,即滿足指定條件才會觸發中斷的斷點,某些時候這非常有用,譬如某些信號量達到預定值才會觸發中斷,如果Java中的異常中斷一樣。

# 設置條件斷點 
break line_num if [expression]

譬如,break swap if m > 100,需要注意只有在斷點處m變量生效,該條件才會生效。

對于已經設置的斷點可以使用condition指定:

# 給break_id斷點設置中斷條件
condition break_id [expresion]

# 取消中斷條件,只要后面什么條件也不跟即可
condition break_id

2.3 常用的指令

help-幫助指令

run-運行

quit-退出

break-打斷點,可以斷某個行或者某個函數如`break main`

next-下一行,簡寫`n`

step-也是下一行,不同于next的是,如果某個行本身引用了函數,則會step into到該函數內部去,簡寫`s`

finish-跳出當前函數/或者打到下一個斷點

continue,下一個斷點或者運行到結尾,簡寫`c`

display-跟蹤打印某個變量的值

print-一次打印當前狀態下所指定變量的值

detele-刪除全部斷點

info breakpoint-全部斷點信息

clear-清楚斷點,clear function,清楚函數斷點

until-類似于next,但是在循環中時,它可以一步到位直接到循環結束,而不像next一樣執行每一次迭代

list-列出當前行上下的代碼,list function列出函數的代碼

2.4 一些補充——棧幀觀察、監測點

補充兩點內容。

我們知道系統會使用棧(Stack)數據結構存儲調用函數,運行中的函數入棧,運行完畢則出棧。棧元素主要被包含函數地址、局部變量、參數名等。當我們需要了解程序的調用路徑的時候,可以使用info stack等語句追蹤函數運行軌跡。

第二點涉及到觀測點(watchpoint)或者說監測點。觀測點設置后會被當作斷點一樣對待。與普通斷點(breakpoint)不同的是,觀測點主要關注一個或者多個被聲明的變量,當這些變量變動或者這些變量被調用時,則觸發【觀測點】。

1 調用棧查詢

當到達一個斷點的時候,想查看此時的調用棧?

# backtrace顯示當前程序的調用棧,或者使用bt指令
backtrace

# 顯示一個棧幀詳情,frame_id就是bt查詢結果的第一列數值
frame [farme_id]

當程序運行到某個函數時,該函數位于棧結構的頂部——即當前棧,可以使用info指令查詢當前棧的詳情:

# 當前棧頂詳情
# 其中會有eip和ebp兩個數值,eip表示下一個指令地址;ebp表示當前棧幀地址
info frame

# 查詢當前棧幀的局部變量
info locals

# 查詢當前棧幀的入參
info args
2 觀測點

首先需要注意的是,只有相應的變量對當前棧幀可見,才可以在這個時候定義該變量的觀測點。

有三種創建觀測點的方法,側重點各不相同,指令格式為watch [expresion]

# 表達式內的變量都會被監測到
#所以a、b的值有變動,就會觸發觀測點,此時暫時程序下來,如同斷點觸發一樣
watch a+b
# b被讀取即觸發斷點
rwatch b
# a或者b被讀取、修改、參與計算都會觸發斷點
awatch a+b

一般情況下,使用watch指令足夠了。

上述內容就是如何進行C程序調試與GDB入門,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

太康县| 大洼县| 松潘县| 诸城市| 新疆| 五常市| 木里| 安陆市| 赤城县| 荆门市| 镇巴县| 马鞍山市| 壶关县| 毕节市| 张家口市| 全州县| 拜城县| 南开区| 云林县| 和顺县| 金溪县| 治县。| 宣汉县| 汉沽区| 白银市| 台中市| 通道| 六盘水市| 千阳县| 万载县| 常熟市| 手机| 江油市| 罗江县| 阿鲁科尔沁旗| 涿州市| 会宁县| 大邑县| 衡水市| 上栗县| 通道|