1. 普通斷點
根據代碼行數設置斷點是最常見的一種方式,在debug程序運行前就可以進行斷點的配置。如:
(gdb) b src/main.cpp:127
當程序執行到main.cpp
文件的第127行時就會出發斷點。
2. 條件斷點
顧名思義,這種斷點是當滿足一定條件時才會觸發,比較適合進行異常排查。設置方式(gdb)break line-or-function if (condition)
, 如:
(gdb) b src/main.cpp:127 if cnt==10
3. 數據斷點
就是根據地址來進行設置斷點,只能是在debug程序運行之后設置,因為只有運行后,你才能很方便地獲知變量的地址。當該地址上的內容發生改變時就會觸發斷點。
設置數據斷點有兩種方式,一種是直接指出地址值,如:
(gdb) b *0x400522
注意必須加*號。而獲取地址值的方法是,先設置普通斷點,在斷點處print &變量名
就能獲取該變量的地址。
另一種當然就是直接設置變量名了,如:
(gdb) b &變量名
4. 函數斷點
這種斷點是當程序執行到某個程序時就會觸發斷點。設置方式如:
(gdb) b funcName
但是函數斷點並不是對所有函數都有效,比如優化后的靜態函數和inline函數等,可能就無法觸發斷點。
5. 監視
設置監視也必須是在程序運行后才行。如:
(gdb) watch *地址 # 當地址所指內容發送變化時斷點
(gdb) watch var #當var值變化時,斷點
(gdb) watch (condition) #當條件符合時,斷點
監視也被稱為硬件斷點。可以監測棧變量和堆變量值的變化,當被監測變量值發生變化時,程序被停住。