gdb調(diào)試中設置監(jiān)控點watch,rwatch,awatch的區(qū)別及說明
一. watch 命令的兩種監(jiān)控機制
在 gdb 調(diào)試中,
watch 命令有兩種設置觀察點的方式:
- 硬件觀察點
- 軟件觀察點
注意:
而 awatch 和 rwatch 命令只能設置硬件觀察點。
watch 命令所支持的兩種設置機制
軟件觀察點:
所謂軟件觀點(software watchpoint),即用 watch 命令監(jiān)控目標變量(表達式)后,GDB 調(diào)試器會以單步執(zhí)行的方式運行程序,并且每行代碼執(zhí)行完畢后,都會檢測該目標變量(表達式)的值是否發(fā)生改變,如果改變則程序執(zhí)行停止。
可想而知,設置軟件觀察點的方式,一定程度上會影響程序的執(zhí)行效率。但從另一個角度看,調(diào)試程序的目的并非是為了獲得運行結果,而是查找導致程序異?;?Bug 的代碼,因此即便軟件觀察點會影響執(zhí)行效率,一定程度上也是可以接受的。
硬件觀察點:
所謂硬件觀察點(Hardware watchpoint),和前者最大的不同是,它在實現(xiàn)監(jiān)控機制的同時不影響程序的執(zhí)行效率。
簡單的理解,系統(tǒng)會為 gdb 調(diào)試器提供少量的寄存器(例如, 32 位的 Intel x86 處理器提供有 4 個調(diào)試寄存器),每個寄存器都可以作為一個觀察點協(xié)助 gdb調(diào)試器完成監(jiān)控任務。
需要注意的是,基于寄存器個數(shù)的限制,如果調(diào)試環(huán)境中設立的硬件觀察點太多,則有些可能會失去作用,這種情況下,
gdb 調(diào)試器會發(fā)出如下警告:
Hardware watchpoint num: Could not insert watchpoint
除此之外,受到寄存器數(shù)量的限制,可能會出現(xiàn):無法使用硬件觀察點監(jiān)控數(shù)據(jù)類型占用字節(jié)數(shù)較多的變量(表達式)。
例如,某些操作系統(tǒng)中,gdb 調(diào)試器最多只能監(jiān)控 4 個字節(jié)長度的數(shù)據(jù),這意味著 C、C++ 中 double 類型的數(shù)據(jù)是無法使用硬件觀察點監(jiān)測的。
這種情況下,可以考慮將其換成占用字符串少的 float 類型。
目前,大多數(shù) PowerPC 或者基于 x86 的操作系統(tǒng),都支持采用硬件觀點。
并且 gdb 調(diào)試器在建立觀察斷點時,會優(yōu)先嘗試建立硬件觀察點,只有當前環(huán)境不支持硬件觀察點時,才會建立軟件觀察點。
借助如下指令,即可強制 gdb 調(diào)試器只建立軟件觀察點:
set can-use-hw-watchpoints 0
注意,在執(zhí)行此命令之前建立的硬件觀察點,不會受此命令的影響。
awatch 命令和 rwatch 命令只能設置硬件觀察點,如果系統(tǒng)不支持或者借助如上命令禁用,
則 GDB 調(diào)試器會打印如下信息:
Expression cannot be implemented with read/access watchpoint.
二. watch 命令,rwatch 命令,awatch 命令的區(qū)別
1. watch 命令可以設置硬件觀察點方式或軟件觀察點的方式。而 rwatch 命令與 awatch 命令只能設置硬件觀察點的方式。
2. 每個命令的功能不同。
- watch 命令,即變量(或表達式)的值改變,程序都會停下來。
- rwatch 命令,即當發(fā)生讀取變量行為時,程序就會暫停住。
- awatch 命令,即當發(fā)生讀取變量或改變變量值的行為時,程序就會暫停住。
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
linux負載均衡總結性說明 四層負載和七層負載有什么區(qū)別
這篇文章主要為大家詳細介紹了linux負載均衡的相關資料,什么是負載均衡?四層負載和七層負載有什么區(qū)別?具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04linux下Vps自動備份web和mysql數(shù)據(jù)庫的腳本
這篇文章主要介紹了vps下web與mysql數(shù)據(jù)庫的備份方法,需要的朋友可以參考下2012-05-05在 Linux 終端中查找域名 IP 地址的命令(五種方法)
本教程介紹了如何在 Linux 終端驗證域名或計算機名的 IP 地址。我們將教你如何有效使用這些命令在 Linux 終端中識別多個域的 IP 地址信息2019-12-12Linux下設置防火墻白名單(RHEL 6和CentOS 7)的步驟
下面小編就為大家?guī)硪黄狶inux下設置防火墻白名單(RHEL 6和CentOS 7)的步驟。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-11-11