你很可能需要知道这个调试小技巧
緣起
最近在調(diào)試的時候,需要觀察第三方容器中每一個元素的值。默認情況下,vs 并不知道如何顯示第三方容器的內(nèi)容,只能手動觀察容器中的每一個值,超級不方便。我找到一個非常給力的好辦法,你還知道其它好辦法嗎?
為了更直觀的感受這種便利,我特意截圖對比了三種常用的觀察變量的方法。
直接觀察
1、通過 vs 的懸浮提示觀察。
小貼士:把鼠標移動到對應的變量即可。
可以發(fā)現(xiàn),現(xiàn)在 vs 并不知道如何解析 pts 的內(nèi)容,只能 “傻傻” 的顯示出 bvector 中的三個成員。
2、通過 watch 窗口觀察。
小貼士:可以使用快捷鍵 ctrl + alt + w, 1 來打開第一個 watch 窗口。據(jù)我觀察,最多支持 4 個 watch 窗口。
可以發(fā)現(xiàn),我們可以在代碼中使用的 at(index) 和 [index] 已經(jīng)失效了,只能使用蹩腳的 (pts._C_alloc)._C_begin + index 來觀察對應的變量(反人類,有木有)。
你也許好奇,我是怎么知道可以使用 (pts._C_alloc)._C_begin + index 來觀察的,簡單!在懸浮提示中,右鍵,復制表達式(X),如下圖:
3、通過 quick watch 窗口觀察。
小貼士:可以選中要觀察的變量,然后按快捷鍵 shift + f9 打開快速監(jiān)視窗口。
同樣,沒什么用。
難道只能這么低效嗎?vs2012 之前是的,但是事情從 vs2012 發(fā)生了變化。從 vs2012 開始,vs 支持通過 ?natvis 來觀察變量,超級方便。
話不多說,開啟 natvis 后再使用上面的三種方法觀察同樣的變量。
開啟 natvis 后觀察
1、通過 vs 的懸浮提示觀察。
2、通過 watch 窗口觀察。
3、通過 quick watch 窗口觀察。
有木有很方便?要是很多元素要觀察(比如,有 128 或者 1024 個),是不是可以節(jié)省很多時間?
如何開啟
可以自己編寫 .natvis文件并放到指定目錄下,重啟 vs 后即可加載。請原諒我比較懶,直接從官方文檔上摘錄了一段,更多內(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 沒親自確認),可以自動重新加載修改的 .natvis 文件內(nèi)容,但是 vs2012/vs2013 并不支持動態(tài)加載。
排錯
如果 natvis 加載有問題,可以通過設(shè)置注冊表開啟診斷信息[2]
[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0_Config\Debugger] "EnableNatvisDiagnostics"=dword:00000001windbg 中的 natvis
windbg 中也可以使用 dx 命令來進行一些高級查看(超級超級厲害的 dx 命令),具體參考 defrag tools 上的視頻。
Defrag Tools #138 - Debugging - 'dx' Command Part 1[3]
Defrag Tools #139 - Debugging - 'dx' Command Part 2[4]
最后,附上文中用到的 .natvis 文件,大家可以做個參考。
示例
<?xml?version="1.0"?encoding="utf-8"?> <AutoVisualizer?xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010"><!--from?bvector?--><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_begin</Item>??<Item?Name="[capacity]">(_C_alloc._C_bufend?-?_C_alloc._C_begin)</Item>??<ArrayItems>??<Size>_C_alloc._C_end?-?_C_alloc._C_begin</Size>??<ValuePointer>_C_alloc._C_begin</ValuePointer>??</ArrayItems>??</Expand>??</Type> </AutoVisualizer>總結(jié)
調(diào)試時,鼠標懸停到對應的變量上可以通過懸浮提示觀察變量的值。
使用 ctr + alt + w,1 可以快速打開 watch 1 窗口。
鼠標懸浮到變量上,按 shift + f9 可以打開快速觀察窗口。
.natvis 文件可以讓我們個性化的觀察變量,可以極大的提高我們的調(diào)試效率。
在高版本的 vs 中,我們甚至可以動態(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
需要你的
總結(jié)
以上是生活随笔為你收集整理的你很可能需要知道这个调试小技巧的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: EntityFramework Core
- 下一篇: 全宇宙首本 VS Code 中文书,来了