當我們在VS的C++中使用vector、list、map等這些STL容器,在開啟調試的時候可以看到這樣的信息: 然而在我們自己手寫鏈表,調試的時候卻要像這樣一級一級展開,很是麻煩。 有時候會想,如果要能像STL裡面的list那樣子直接顯示出來就方便許多。經過幾番尋找,終於被我找到了方法。 使用 .n ...
當我們在VS的C++中使用vector、list、map等這些STL容器,在開啟調試的時候可以看到這樣的信息:
然而在我們自己手寫鏈表,調試的時候卻要像這樣一級一級展開,很是麻煩。
有時候會想,如果要能像STL裡面的list那樣子直接顯示出來就方便許多。經過幾番尋找,終於被我找到了方法。
使用 .natvis 文件
.natvis文件使用了xml格式來進行擴展,在%VSINSTALLDIR%\Common7\Packages\Debugger\Visualizers路徑中,stl.nativs文件包含了C++中幾乎所有常用類的自定義調試信息,可以去翻閱裡面的一些常用類來學習使用,原理也不是很複雜。
你可以自行編寫一個.natvis的文件,但是需要將該文件放到以下兩個路徑之一:
%VSINSTALLDIR%\Common7\Packages\Debugger\Visualizers(需求管理員許可權)
%USERPROFILE%\My Documents\Visual Studio 2017\Visualizers(若不存在Visualizers文件夾可自行新建一個)
該文件的編寫有一個好處:你可以保持VS在調試狀態,然後實時去修改.natvis文件。當你保存的時候,就會立即作用於調試視窗。而如果編寫出現語法錯誤的話,則調試器會以原始的形式顯示(或者找到另一個可用的顯示)。
在你想要開始嘗試編寫該種格式的文件前,可以先在工具--選項--調試--輸出視窗--Natvis診斷信息(僅限C++)選擇為詳細,這樣在保存.natvis沒得到理想結果後在輸出視窗可以看到錯誤消息,不需要的時候再關掉即可。
新建一個 .natvis 文件
在項目中右鍵添加新建項,選擇Visual C++中的實用工具,找到調試器可視化文件,然後修改新建位置到上述兩個路徑之一。
新建好後,就可以看到它預設生成的代碼。
這篇博文並不打算從繁雜的語法開始講起,而是直接以各種實例來進行說明。而且在輸入這些代碼的時候會有代碼補全和功能提示,可以自己多動手嘗試。有興趣的話可以去參考文章末尾的鏈接。
自定義數組結構體/類
現在有一個簡易的數組結構體:
typedef struct Array
{
int *data;
int size;
} Array;
又或者是個類:
class Array
{
//...
private:
int *data;
int size;
};
然後對應的.natvis格式文件如下:
<?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
<Type Name="Array">
<DisplayString> {{ size = {size} }}</DisplayString>
<Expand>
<Item Name="[size]">size</Item>
<ArrayItems>
<Size>size</Size>
<ValuePointer>data</ValuePointer>
</ArrayItems>
</Expand>
</Type>
</AutoVisualizer>
最終的顯示效果如下:
當Array為class的時候上述文件也是有效的。
其中,Type Name指定了需要可視化的類型名。
在DisplayString中的內容指定了該變數在值這一列中需要顯示的內容,{{}}兩對大括弧使得在調試器中輸出{},而{}單對大括弧用於引用變數內的成員。
Expand用於指定變數展開時需要顯示的項,其中顯示的原始視圖對應未使用Debug Visualizers的情況。
Item可以指定需要添加可視化輸出的成員項,這裡可以指定Name的字元串來決定在名稱這一列顯示什麼,而中間的size則是指定了需要顯示的成員的值(這裡不需要加任何別的修飾)。
ArrayItems說明需要顯示的數據類型是連續記憶體的數組,在內部的Size指定了需要顯示的數目,這裡綁定到成員size,而ValuePointer則需要綁定數組首元素的指針。
時間太晚,暫時先寫到這裡,後面有時間會繼續補充。
參考鏈接:
https://blogs.msdn.microsoft.com/vcblog/2015/09/28/debug-visualizers-in-visual-c-2015/
https://msdn.microsoft.com/zh-cn/library/jj620914(v=vs.110).aspx