你所不知道的Visual Studio監視窗口的使用方法

嫌我囉嗦的可以直接看MSDN:


【監視】窗口是很常用的調試窗口,與【自動窗口】、【局部變量】窗口很相似,但是更爲強大,不僅可以顯示變量的值,還可以顯示任意符合語法的表達式的值,甚至可以修改變量的值。

但是用【監視】窗口有些時候會出現一些尷尬的情況,例如
1.我想將int顯示成字符。解決方法:(char)強制類型轉換
2.我想看new出來的數組的內容,他卻給我顯示首地址。解決方法:(類型(*)[數組長度])強制類型轉換
4.我想看Windows消息的名稱,他卻給我顯示一個整數。解決方法:手工查頭文件
……
強制類型轉換方式格式化顯示
簡直苦大仇深啊!!如果說前兩個不是剛性需求,第三個則會吐血,因爲Windows消息可沒辦法通過強制類型轉換解決問題。現在就到格式說明符出場了,直接上圖:
格式說明符格式化顯示
可以看到,Windows消息的變量msg已經顯示爲WM_GETDLGCODE了,而數組和int也實現了上圖的顯示效果,僅僅是加了“,”和一個短的字符串,這個就是格式說明符。全部的格式說明符如下:
說明符 格式 原始監視值 顯示的值
d 十進制整數 0x00000066 102
o 無符號的八進制整數 0x00000066 000000000146
x

 h
十六進制整數 102 0xcccccccc
X

 H
十六進制整數 102 0xCCCCCCCC
c 單個字符 0x0065, c 101 'e'
const char * 字符串 <location> “hello world” "hello world"
sb const char * 字符串 <location> “hello world” hello world
s8 const char * 字符串 <location> “hello world” "hello world"
s8b const char * 字符串 <location> “hello world” "hello world"
su const wchar_t* const

char16_t * 字符串
<location> L”hello world” L"hello world"

u"hello world"
sub const wchar_t* const

char16_t * 字符串
<location> L”hello world” hello world
bstr BSTR string <location> L”hello world” L”hello world”
s32 UTF-32 string <location> U”hello world” U”hello world”
s32b UTF-32 string (no quotation marks) <location> U”hello world” hello world
en enum Saturday(6) 星期六
hv 指針類型 - 指示被檢查的指針值是數組的堆分配的結果,如 new int[3] <location>{<first member>} <location>{<first member>, <second member>, …}
na 取消指向對象的指針的內存地址。 <location>, {member=value…} {member=value…}
nd 僅顯示基類信息,忽略派生的類 (Shape*) square 包括基類和派生類信息 僅顯示基類信息
hr HRESULT 或 Win32 錯誤代碼。 (調試器自動將 HRESULT 解碼,因此這些情況下不需要該說明符。) S_OK S_OK
wc 窗口類標誌 0x0010 WC_DEFAULTCHAR
wm Windows 消息數字 16 WM_CLOSE
! 原始格式,忽略任何數據類型視圖自定義項 <customized representation> 4
System_CAPS_ICON_note.jpg 說明

如果存在“hv”格式說明符,調試器會嘗試確定緩衝區的長度並顯示相應的元素數。 由於調試器並非總是可以查找確切的數組緩衝區大小,只要可能時,就應該使用大小說明符 (pBuffer,[bufferSize])。 “Hv”格式說明符用於緩衝區大小尚不可使用的情況。


然後是僞變量:
這裏介紹的僞變量是$err,僞變量都以$開頭。$err可以顯示API調用的結果狀態,也就是如果在調用一個API函數之後調用GetLastError函數得到的值,配合hr格式說明符可以看到API執行的狀態
err僞變量
上一次的API執行時成功完成,本來$err的值是0,配合hr格式說明符顯示成了ERROR_SUCCESS。

另外僞變量還可以在反彙編調試時顯示寄存器的值,例如$eax、$ebx,不過不支持浮點寄存器XMM0~7。不過,如果是寄存器僞變量,如果C/C++代碼中沒有重名的變量,是可以不加上$的。


到此爲止,詳細請看文章開頭的鏈接。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章