你很可能需要知道這個(gè)調(diào)試小技巧
緣起
最近在調(diào)試的時(shí)候,需要觀察第三方容器中每一個(gè)元素的值。默認(rèn)情況下,vs 并不知道如何顯示第三方容器的內(nèi)容,只能手動(dòng)觀察容器中的每一個(gè)值,超級(jí)不方便。我找到一個(gè)非常給力的好辦法,你還知道其它好辦法嗎?
為了更直觀的感受這種便利,我特意截圖對(duì)比了三種常用的觀察變量的方法。
直接觀察
1、通過 vs 的懸浮提示觀察。
小貼士:把鼠標(biāo)移動(dòng)到對(duì)應(yīng)的變量即可。

可以發(fā)現(xiàn),現(xiàn)在 vs 并不知道如何解析 pts 的內(nèi)容,只能 “傻傻” 的顯示出 bvector 中的三個(gè)成員。
2、通過 watch 窗口觀察。
小貼士:可以使用快捷鍵
ctrl + alt + w, 1來打開第一個(gè)watch窗口。據(jù)我觀察,最多支持4個(gè)watch窗口。

可以發(fā)現(xiàn),我們可以在代碼中使用的 at(index) 和 [index] 已經(jīng)失效了,只能使用蹩腳的 (pts._C_alloc)._C_begin + index 來觀察對(duì)應(yīng)的變量(反人類,有木有)。
你也許好奇,我是怎么知道可以使用 (pts._C_alloc)._C_begin + index 來觀察的,簡(jiǎn)單!在懸浮提示中,右鍵,復(fù)制表達(dá)式(X),如下圖:

3、通過 quick watch 窗口觀察。
小貼士:可以選中要觀察的變量,然后按快捷鍵
shift + f9打開快速監(jiān)視窗口。

同樣,沒什么用。
難道只能這么低效嗎?vs2012 之前是的,但是事情從 vs2012 發(fā)生了變化。從 vs2012 開始,vs 支持通過 ?natvis 來觀察變量,超級(jí)方便。
話不多說,開啟 natvis 后再使用上面的三種方法觀察同樣的變量。
開啟 natvis 后觀察
1、通過 vs 的懸浮提示觀察。

2、通過 watch 窗口觀察。

3、通過 quick watch 窗口觀察。

有木有很方便?要是很多元素要觀察(比如,有 128 或者 1024 個(gè)),是不是可以節(jié)省很多時(shí)間?
如何開啟
可以自己編寫 .natvis文件并放到指定目錄下,重啟 vs 后即可加載。請(qǐng)?jiān)徫冶容^懶,直接從官方文檔上摘錄了一段,更多內(nèi)容可以參考文末給出的參考鏈接。
搜索位置及順序轉(zhuǎn)載如下[1]
If multiple valid entries are encountered for the same type, the first one in the following list will be used:
- PDB
- Project/solution
- User directory: %USERPROFILE%\My Documents\Visual Studio 2015\Visualizers
- Install directory: %VSINSTALLDIR%\Common7\Packages\Debugger\Visualizers
我放到了 %USERPROFILE%\My Documents\Visual Studio 2013\Visualizers 下。

提示
在高版本的 vs 中(vs2017/vs2019 ,vs2015 沒親自確認(rèn)),可以自動(dòng)重新加載修改的 .natvis 文件內(nèi)容,但是 vs2012/vs2013 并不支持動(dòng)態(tài)加載。
排錯(cuò)
如果 natvis 加載有問題,可以通過設(shè)置注冊(cè)表開啟診斷信息[2]
[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0_Config\Debugger]
"EnableNatvisDiagnostics"=dword:00000001
windbg 中的 natvis
windbg 中也可以使用 dx 命令來進(jìn)行一些高級(jí)查看(超級(jí)超級(jí)厲害的 dx 命令),具體參考 defrag tools 上的視頻。
- Defrag Tools #138 - Debugging - 'dx' Command Part 1[3]
- Defrag Tools #139 - Debugging - 'dx' Command Part 2[4]
最后,附上文中用到的 .natvis 文件,大家可以做個(gè)參考。
示例
<AutoVisualizer?xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
??
??<Type?Name="Bentley::Bstdcxx::bvector<*>">??
??<DisplayString>{{size?=?{_C_alloc._C_end?-?_C_alloc._C_begin}}}DisplayString>??
??<Expand>??
????<Item?Name="[size]">_C_alloc._C_end?-?_C_alloc._C_beginItem>??
????<Item?Name="[capacity]">(_C_alloc._C_bufend?-?_C_alloc._C_begin)Item>??
????<ArrayItems>??
??????<Size>_C_alloc._C_end?-?_C_alloc._C_beginSize>??
??????<ValuePointer>_C_alloc._C_beginValuePointer>??
????ArrayItems>??
??Expand>??
??Type>
AutoVisualizer>
總結(jié)
調(diào)試時(shí),鼠標(biāo)懸停到對(duì)應(yīng)的變量上可以通過懸浮提示觀察變量的值。
使用
ctr + alt + w,1可以快速打開watch 1窗口。鼠標(biāo)懸浮到變量上,按
shift + f9可以打開快速觀察窗口。.natvis文件可以讓我們個(gè)性化的觀察變量,可以極大的提高我們的調(diào)試效率。在高版本的
vs中,我們甚至可以動(dòng)態(tài)編輯.natvis文件的內(nèi)容,更加靈活的觀察變量。windbg中的dx命令,可謂神器,但是本文并未介紹,感興趣的小伙伴兒可以直接看視頻!
參考資料
- https://blogs.msdn.microsoft.com/vcblog/2015/09/28/debug-visualizers-in-visual-c-2015/
- https://blogs.msdn.microsoft.com/vcblog/2014/06/12/project-support-for-natvis/
- https://docs.microsoft.com/en-us/cpp/build/reference/natvis-add-natvis-to-pdb?view=vs-2017
- https://docs.microsoft.com/en-us/visualstudio/debugger/create-custom-views-of-native-objects?view=vs-2017
- https://social.msdn.microsoft.com/Forums/vstudio/en-US/6e4a67f8-1239-4b3c-af45-f5ea5ea41e80/enabling-natvis-diagnostic-mode
- https://stackoverflow.com/questions/17811628/user-defined-natvis-files-in-visual-studio-2012
References
[1]搜索位置及順序轉(zhuǎn)載如下: https://blogs.msdn.microsoft.com/vcblog/2015/09/28/debug-visualizers-in-visual-c-2015/
[2]開啟診斷信息: https://social.msdn.microsoft.com/Forums/vstudio/en-US/6e4a67f8-1239-4b3c-af45-f5ea5ea41e80/enabling-natvis-diagnostic-mode
[3]Defrag Tools #138 - Debugging - 'dx' Command Part 1: https://channel9.msdn.com/Shows/Defrag-Tools/Defrag-Tools-138-Debugging-dx-Command-Part-1
[4]Defrag Tools #139 - Debugging - 'dx' Command Part 2: https://channel9.msdn.com/Shows/Defrag-Tools/Defrag-Tools-139-Debugging-dx-Command-Part-2
需要你的![]()
