您好,登錄后才能下訂單哦!
本篇文章為大家展示了如何進行C程序調試與GDB入門,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
引用自<assert.h>
的函數assert(int expression)
,當表達式的值為0則返回failed
。
gdb是GUN的提供在unix上的調試工具。
安裝:sudo apt install gdb
如果是windows,則尋找對應的exe安裝即可,同時需要配置環境變量
# 編譯,得到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
著重說一下斷點的標識和查詢。
怎么打斷點
# 直接在函數上打斷點 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
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列出函數的代碼
補充兩點內容。
我們知道系統會使用棧(Stack)數據結構存儲調用函數,運行中的函數入棧,運行完畢則出棧。棧元素主要被包含函數地址、局部變量、參數名等。當我們需要了解程序的調用路徑的時候,可以使用info stack
等語句追蹤函數運行軌跡。
第二點涉及到觀測點(watchpoint)或者說監測點。觀測點設置后會被當作斷點一樣對待。與普通斷點(breakpoint)不同的是,觀測點主要關注一個或者多個被聲明的變量,當這些變量變動或者這些變量被調用時,則觸發【觀測點】。
當到達一個斷點的時候,想查看此時的調用棧?
# backtrace顯示當前程序的調用棧,或者使用bt指令 backtrace # 顯示一個棧幀詳情,frame_id就是bt查詢結果的第一列數值 frame [farme_id]
當程序運行到某個函數時,該函數位于棧結構的頂部——即當前棧,可以使用info
指令查詢當前棧的詳情:
# 當前棧頂詳情 # 其中會有eip和ebp兩個數值,eip表示下一個指令地址;ebp表示當前棧幀地址 info frame # 查詢當前棧幀的局部變量 info locals # 查詢當前棧幀的入參 info args
首先需要注意的是,只有相應的變量對當前棧幀可見,才可以在這個時候定義該變量的觀測點。
有三種創建觀測點的方法,側重點各不相同,指令格式為watch [expresion]
。
# 表達式內的變量都會被監測到 #所以a、b的值有變動,就會觸發觀測點,此時暫時程序下來,如同斷點觸發一樣 watch a+b
# b被讀取即觸發斷點 rwatch b
# a或者b被讀取、修改、參與計算都會觸發斷點 awatch a+b
一般情況下,使用watch
指令足夠了。
上述內容就是如何進行C程序調試與GDB入門,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。