• Visual Studio Debugger AutoExp.dat & Visualization Framework


    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 定义如下

    1 class Box
    2 {
    3     int a;
    4     char str[10];
    5     ...
    6     ...
    7 };

    你在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

     1 #pragma once
     2 class Box
     3 {
     4     static unsigned int s_nInstance;
     5     const char* m_name;
     6     const unsigned int m_ID;
     7 public:
     8     Box();
     9     ~Box();
    10 };

    Box.cpp

     1 #include "Box.h"
     2 
     3 unsigned int Box::s_nInstance = 0;
     4 
     5 Box::Box() :m_name("box"), m_ID(++s_nInstance)
     6 {
     7 }
     8 
     9 
    10 Box::~Box()
    11 {
    12 }

    main.cpp

    1 #include "Box.h"
    2 
    3 int main()
    4 {
    5     Box b1, b2;
    6     return 0;      
    7 }

    调试:

    修改AutoExp.dat, 在 [Visualizer] 区域内添加代码:

    1 MyBox{
    2     preview
    3     (
    4         #(
    5             "[Name = ", $c.m_name, "ID = ", $c.m_ID, "]"
    6         )
    7     )
    8 }

    然后确保这个选项没有被勾选:

    注意, VS2013不再使用AutoExp.dat了, 所以无论你怎么修改AutoExp.dat都不会起作用的, VS2013默认用natvis文件.(XML). Qt 也用的是 natvis文件 (比如Qt5用的就是qt5.natvis)

    natvis文件的目录是:%VS_INSTALL_DIR%Common7PackagesDebuggerVisualizers

    见:

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

    你需要做的就是写一个自己的 .natvis 文件并放到以下目录即可:

    %VS_INSTALL_DIR%Common7PackagesDebuggerVisualizers

    比如写一个 MyVisualizers.natvis , 内容如下 (模板是抄的该目录下现成的 .natvis 文件)

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
     3 
     4     <Type Name="MyBox">
     5         <DisplayString>MyBox[{m_ID}]</DisplayString>
     6         <Expand>
     7             <Item Name="[m_name]">m_name</Item>
     8             <Item Name="[m_ID]">m_ID</Item>
     9         </Expand>
    10     </Type>
    11 
    12 </AutoVisualizer>

    然后把 MyVisualizers.natvis 放到该目录. 调试的时候如果遇到类型名为 MyBox 的就会按照 MyVisualizers.natvis 中定义的规则来显示调试信息

    效果如图

    至于这个XML文件的语法含义是什么可以借鉴该目录下的其他 .natvis 文件的内容作为例子 (不过我感觉因为缺少注释和文档还是有些细节不知道什么含义)

    去看官方文档:

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

  • 相关阅读:
    Jzoj3899 逻辑的连通性
    第三十九天 how can I 坚持
    第三十八天 how can I 坚持
    第三十七天 how can I 坚持
    第三十六天 how can I 坚持
    第三十五天 how can I 坚持
    第三十四天 how can I 坚持
    第三十三天 how can I 坚持
    第三十二天 how can I 坚持
    逆向iOS SDK -- _UIImageAtPath 的实现(SDK 5.1)
  • 原文地址:https://www.cnblogs.com/qrlozte/p/4976011.html
Copyright © 2020-2023  润新知