目錄
- 1、Assert
- 2、GDB
- 2.1 使用流程
- 2.2 斷點和條件中斷
- 2.3 常用的指令
- 2.4 一些補充——堆疊幀觀察、監測點
- 1 呼叫堆疊查詢
- 2 觀測點
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指令足夠了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/1862.html
標籤:C
上一篇:C 實戰練習題目85
下一篇:C 實戰練習題目86
