bing.com搜尋: autoexp.dat

參考資料:

AutoExp.dat

http://www.virtualdub.org/blog/pivot/entry.php?id=120

http://www.cnblogs.com/cutepig/archive/2010/08/12/1798079.html

http://www.cppblog.com/flyinghare/archive/2010/09/27/127836.html

http://cppblog.com/Streamlet/archive/2011/02/27/140742.html

http://blogs.msdn.com/b/dsvc/archive/2012/02/10/why-autoexp-dat-data-visualizer-entries-are-ignored-at-times.aspx

http://blog.csdn.net/qiudaowen/article/details/8054718

https://msdn.microsoft.com/en-us/library/aa730838(v=vs.80).aspx

從版本VS2012起, 比AutoExp.dat更好的方式 - Visualization Framework:

http://blogs.msdn.com/b/vcblog/archive/2012/07/12/10329460.aspx

https://code.msdn.microsoft.com/Writing-type-visualizers-2eae77a2#content

https://msdn.microsoft.com/en-us/library/jj620914.aspx

  @

備註: VS2013雖然支援了NATVIS, 但不支援把NATVIS檔案包括到專案中去(以及生成到PDB檔案中), VS2015支援這些功能.

為什麼不像.NET或者JAVA那樣呼叫toString?

  http://blogs.msdn.com/b/vcblog/archive/2013/06/28/using-visual-studio-2013-to-write-maintainable-native-visualizations-natvis.aspx

http://www.cnblogs.com/TianFang/p/3963406.html

http://blogs.msdn.com/b/mgoldin/archive/2012/06/06/visual-studio-2012-and-debugger-natvis-files-what-can-i-do-with-them.aspx

Debug java程式碼的時候eclipse會呼叫一個object的toString來獲得其內容顯示到debugger的視窗上, 這樣就使得開發者除錯的時候非常方便檢視其想要的資訊.

Visual Studio卻採用的不是這個方法. 你如果寫了一個class Box, VS 並不知道你Debug的時候對於Box object最希望展示的是什麼資訊, 所以你就得跟開啟檔案樹一樣, 展開 Box 物件才能看到內部資訊.

比如說你的 class Box 定義如下

 class Box
{
int a;
char str[];
...
...
};

你在Debug的時候可能想直接看到str的內容, 而不是把Box object給展開才能看到. 最開始我一直以為展開是唯一的辦法了, 最近接觸了 Qt 突然發現 QString 在Debug視窗內直接展示的就是其內部string的內容,  我才知道原來這個是可以實現的. 上bing.com搜了一下 "visual studio customize debug window"終於搜到上面的blog. 這才知道原來有個叫AutoExp.dat的東西是專門用來定製你debug的時候想看到的東西(雖然沒有toString那種方便, 聊勝於無啊!)

Qt 就是通過修改 AutoExp.dat 來實現更user-friendly的Debug資訊的.

現在先做一個Demo來演示怎麼使用AutoExp.dat來定製Debug顯示的資訊.

Box.h

 #pragma once
class Box
{
static unsigned int s_nInstance;
const char* m_name;
const unsigned int m_ID;
public:
Box();
~Box();
};

Box.cpp

 #include "Box.h"

 unsigned int Box::s_nInstance = ;

 Box::Box() :m_name("box"), m_ID(++s_nInstance)
{
} Box::~Box()
{
}

main.cpp

 #include "Box.h"

 int main()
{
Box b1, b2;
return ;
}

除錯:

修改AutoExp.dat, 在 [Visualizer] 區域內新增程式碼:

 MyBox{
preview
(
#(
"[Name = ", $c.m_name, "ID = ", $c.m_ID, "]"
)
)
}

然後確保這個選項沒有被勾選:

注意, VS2013不再使用AutoExp.dat了, 所以無論你怎麼修改AutoExp.dat都不會起作用的, VS2013預設用natvis檔案.(XML). Qt 也用的是 natvis檔案 (比如Qt5用的就是qt5.natvis)

natvis檔案的目錄是:%VS_INSTALL_DIR%\Common7\Packages\Debugger\Visualizers

見:

http://blogs.msdn.com/b/vcblog/archive/2012/07/12/10329460.aspx

你需要做的就是寫一個自己的 .natvis 檔案並放到以下目錄即可:

%VS_INSTALL_DIR%\Common7\Packages\Debugger\Visualizers

比如寫一個 MyVisualizers.natvis , 內容如下 (模板是抄的該目錄下現成的 .natvis 檔案)

 <?xml version="1.0" encoding="utf-8"?>
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010"> <Type Name="MyBox">
<DisplayString>MyBox[{m_ID}]</DisplayString>
<Expand>
<Item Name="[m_name]">m_name</Item>
<Item Name="[m_ID]">m_ID</Item>
</Expand>
</Type> </AutoVisualizer>

然後把 MyVisualizers.natvis 放到該目錄. 除錯的時候如果遇到型別名為 MyBox 的就會按照 MyVisualizers.natvis 中定義的規則來顯示除錯資訊

效果如圖

至於這個XML檔案的語法含義是什麼可以借鑑該目錄下的其他 .natvis 檔案的內容作為例子 (不過我感覺因為缺少註釋和文件還是有些細節不知道什麼含義)

去看官方文件:

https://msdn.microsoft.com/en-us/library/jj620914.aspx