VS除錯技巧
VS除錯中經常使用斷點、堆疊視窗,很少使用監視、快速監視視窗和即時命令視窗。查找了相關資料後發現監視視窗在某些情況下還是很有用的,所以針對上述視窗大體總結了一下;
1.新增監視變數
程式執行過程中命中斷點後,
a. 在變數名稱位置單擊右鍵,”新增監視”;
b. 將變數選中,拖動 到監視視窗;
c. 在監視列表中雙擊,編輯要監視的變數名稱;
2. 監視中檢視、修改變數當前值
a. 若監視的變數為數值,則可選擇數值展示的進位制格式:1) 單擊右鍵,選擇”以x進位制展示”; 1) 通過”變數名稱,格式字元”的方式切換展示方式,如下圖。圖中a變數的當前值為0xabc,”a,d”是以十進位制方式展示;”a,x”是以十六進位制小寫展示。vs支援多種格式字元,詳細說明見如下連結:
b. 雙擊變數值,可做編輯修改,修改後的變數如圖示紅高亮顯式。MSDN上對於標紅高亮的解釋如下:
為什麼在“區域性變數”視窗和“自動”視窗中變數值有時是紅色的?
你可能注意到,在“區域性變數”和“自動”視窗中一個變數的值有時是紅色的。 這些是自上次評估以來更改過的變數值。 此更改可能是在上一次除錯會話中進行的,或者是因為在視窗中更改了該值。
3.計算表示式的值
在監視視窗中可對當前作用域中的可見變數計算相關表示式的值:
a. 變數加減或取址
b.函式或介面呼叫
介面呼叫時,值這一列對應為函式呼叫的返回值,若無返回值則為void
c.檢視地址對應的符號資訊
除錯中需要檢視某些地址位置對應的符號,可以新增到監視視窗,預設地址值以數值方式展示。若明確知道該地址為某一型別變數的地址,則可以將對地址做強制地址轉換,輸入如下表達式:(CSomeType*)0x000aefee。然後就可以看到該地址對應記憶體中的內容。若不知道其實際型別,可嘗試使用”void*”做強制轉換以明確告訴偵錯程式,該值為記憶體地址值,偵錯程式會嘗試做符號解析。測試中發現void*強轉僅對編譯期生成的靜態符號,如函式,靜態變數等能夠準確匹配,堆或棧上分配的資料變數無法匹配(靜態變數定義後需要有訪問、使用,否則編譯器會將其優化掉,導致監視時找不到該變數)。如下圖:
另外,對於監視視窗的使用,CodeProject有篇文章總結的很好,推薦讀一下:
https://www.codeproject.com/articles/121623/10-tips-you-should-know-about-watch-window-while-d