一个好玩的玩意儿:VS 的 autoexp.txt

标签: vs autoexp txt | 发表时间:2011-02-27 17:10 | 作者:溪流 deckcain
出处:http://www.cppblog.com/

嗯,写篇文章的目的是为了把我最新(现在是次新)的那篇文章给刷下去——我不想每次看见它了。

不知大家有没有发现,当使用 VS 来调试代码的时候,那些 STL 容器的信息会以比较看得懂的方式显示出来:

image

 

而我们自己写的,它只能按照数据成员来显示,如果数据结构稍微复杂点,看这些直接显示的内容得到的有用信息就会很少了:

image

 

那么,是否有办法能让 IDE 按照我们设想的方式来显示数据呢?答案是肯定的。这个配置就位于 autoexp.txt 中(具体路径为 X:\Program Files\Microsoft Visual Studio 10.0\Common7\Packages\Debugger\autoexp.dat,如果是 VS 不同版本,“Microsoft Visual Studio 10.0”中的版本号换成其他的即可,VS 2005 以上版本都支持)。

在里面搜索 vector,可以找到作用于 vector 的调试信息显示方式的语句:

std::vector<*>{
    preview (
        #(
            "[",
            $e._Mylast - $e._Myfirst,
            "](",
            #array(
                expr: $e._Myfirst[$i],
                size: $e._Mylast - $e._Myfirst
            ),
            ")"
        )
    )

    children (
        #(
            #([size] : $e._Mylast - $e._Myfirst),
            #([capacity] : $e._Myend - $e._Myfirst),
            #array(
                expr: $e._Myfirst[$i],
                size: $e._Mylast - $e._Myfirst
            )
        )
    )
}

这个语法的详细官方说明好像没有,不过大体上可以猜出来。

第一行 std::vector<*> 是类型,说明下面的内容针对 std::vector,并且适用于任意模版参数。紧接着是一个大括号括起来的段落。

preview 开始的那一段表示当该变量单行显示的时候该如何显示,也就是下图第二列的样子:
image

IDE 会依次显示 preview(#( … )) 括号内的以逗号分隔的内容,加引号的会原样显示,变量用 $e 引用(将 $e 视为该类型的一个变量)。

除了直接引号,变量的运算结果外,这里还可以写一些高级点的玩意儿,如 #array,#list,#tree。

#array 的格式为:
#array(
    expr: … ,
    size:  …
)
其中 expr 里可以使用 $i,$i 为元素 index,size 表示元素个数。最终的结果为:
$i=0时的expr, $i=1时的expr, …, $i=size时的expr。

假设有一个结构:
struct Vector
{
    int *pData;
    int nCount;
};
其中 p 是指向一块 count 个 int 的内存。如果要依次显示这 count 个数字,preview 中应该写:
preview (
    #(
        #array(
            expr: $e.pData[$i],
            size: $e.nCount
        )
    )
)

#list 的格式为:
#list(
    head: … ,
    size: … ,
    next: …
) : …
其中 head 是指向第一个 Node 的指针,size 表示元素个数,next 表示 Node 中指向下一个 Node 的分量名,最后冒号后面还要写一个 Node 中的值分量,也就是要显示的那个变量。

假设有结构:
struct ListNode
{
    int nData;
    ListNode *pNext;
};
struct List
{
    ListNode *pHead;
    int nCount;
};
preview 的写法为:
preview (
    #(
        #list(
            head: $e.pHead,
            size: $e.nCount,
            next: pNext
        ) : $e.nData    // 注意,这里的 $e 代表 ListNode,上面两个 $e 都代表 List
    )
)

#tree的格式为
#tree(
    head: …,
    left: …,
    right: …,
    size: …
) : …
其中 head 是指向根节点的指针,left 和 right 分别是指向左右子树的分量名,size 表示元素个数,最后冒号后面写节点中的值分量。IDE会对整棵树做中序遍历。

假设有结构:
struct TreeNode
{
    int nData;
    TreeNode *pLeft;
    TreeNode *pRight;
};
struct Tree
{
    TreeNode *pRoot;
    int nCount;
};
preview 的写法为:
preview (
    #(
    #tree(
        head: $e.pRoot,
        left: pLeft,
        right: Right,
        size: $e.nCount
        ) : $e.nData // 注意,这里的 $e 代表 TreeNode,上面两个 $e 都代表 Tree
    )
)


preview 的格式就到此。接下来是 children,它用于描述点击变量左边的加号后,展开的内容怎么显示,如图:

image

IDE 会依次显示 children(#( … )) 括号内的以逗号分隔的内容,每个显示为一行。刚才的 #array, #list, #tree 都可以用,会显示成第一列索引第二列值的样子。
另外可以用 #(first, second) 的格式,first 会原样显示在第一列,second 会求值显示在第二列。

 

了解以上这些内容,我们已经可以针对 STL 的那些数据结构做自定义显示了,对一些别的数据结构作简单的自定义显示也不难。

 

最后给个效果图,定义了我自己的那些容器的显示方式。怎么样,看上去一定比开头给出的那个冷冰冰的样子好很多吧?

image



溪流 2011-02-27 17:10 发表评论

相关 [vs autoexp txt] 推荐:

GIF vs APNG vs WebP

- - JayXon
GIF 是一个非常古老的格式,1987 年诞生,最后一个版本是 1989 年. (这就是为什么 GIF 文件头的 magic number 是 GIF89a). APNG 相对新一些,是 Mozilla 在 2004 年推出的,十几年的科技进步是不容小觑的,所以 APNG相对于 GIF 的优势十分明显,后面会分析.

挪威的森林日文原版电子书txt版

- nasachn - 东瀛誌
很久很久以前这里曾经发起过一个名为《挪威的森林》日文原版TXT计划,旨在集合日语学习者的力量将村上春树的《挪威的森林》文本化,以方便大家在各种设备上阅读. 这个计划因为各种原因拖了很久,我在二月的时候将章节任务分配给热心的读者,大约在五月底收到所有人的回复,然后花了几天时间来整合,现在终于可以发布了.

Oracle - Spool导出数据到TXT文件 - CSDN博客

- -
spool的作用可以用一句话来描述:在sqlplus中用来保存或打印查询结果. 即,可以将sql查询的结果保存问文件. set termout off;   //不显示脚本中的命令的执行结果,缺省为on set trimout on;   //去除标准输出每行的拖尾空格,缺省为off set trimspool on;  //去除重定向(spool)输出每行的拖尾空格,缺省为off set term off;.

转 redis vs memcached

- - 数据库 - ITeye博客
传统MySQL+ Memcached架构遇到的问题.   实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加,和访问量的持续增长,我们遇到了很多问题:.   1.MySQL需要不断进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工作占据大量开发时间.

NOSQL数据库大比拼:Cassandra vs MongoDB vs CouchDB vs Redis vs Riak vs HBase

- - 博客园_Ruby's Louvre
话说,尽管 SQL 数据库一直是我们IT行业中最有用的工具,然而,它们这样在行业中超过15年以上的“转正”终于就要寿终正寝了. 现在,虽然关系型数据库仍然无所不在,但它越来越不能满足我们的需要了. 但是,各种 "NoSQL" 数据库之间的差异比当年众多关系型数据库之间的差异要大许多. 这就加大了人们在建设自己的应用是选择合适的数据库的难度.

批次將多個 PDF 轉檔成 TXT 純文字檔(Free PDF to Text Converter)

- 潜纹 - 重灌狂人
如果你需要將手邊多個 pdf 格式的文件轉成 TXT 純文字檔的話,該怎麼做呢. 如果只是一兩個檔案的話,其實使用一般的 PDF 閱讀器如 Adobe Reader 就可以將裡面的文字匯出成純文字檔. 但如果你要轉檔的文件很多的話,可以試試看下面這個免費的 Free PDF to Text Converter 轉檔工具.

3D book – 炫酷 TXT 电子书阅读器 | 小众软件 > 桌面工具

- D_u - 小众软件
羡慕 iBook 看书时的效果吗. 3D Book 可以将你的 TXT 电子书变立体,阅读时具有翻页、旋转等效果,看起来就像在看一本真实的书. 3D Book 在第一次打开文件时会生成索引,之后的打开速度会非常快,另外还有一个类似收藏夹的书架功能,可以保存常看的书籍,也很实用. 根据软件说明,软件采用了 OpenGL ,因此请更新下显卡驱动,另外,软件官网关闭了(确实是关闭,不是和谐),请到网盘下载.

向Sql Server数据库中导入固定格式的txt文本数据

- - CSDN博客推荐文章
文本数据量比较大的时候,一条条的输入基本不可能,写个程序来中转一下也是很麻烦,幸运的是sql server提供了比较简洁的方法. 轻松搞定固定格式文本数据导入,比mysql的sql代码还要简洁. 作者:wj512416359 发表于2014-12-26 16:21:18 原文链接. 阅读:0 评论:0 查看评论.

普通 vs 文艺 vs 二逼

- 貝殼 - The Only Exception