Linux | c&cpp | Email | github | QQ群:425043908 关注本站

itarticle.cc

您现在的位置是:网站首页 -> Windows 文章内容

autoexp.dat使用Visual studio在debug时显示变量内容-itarticl.cc-IT技术类文章记录&分享

发布时间: 8年前Windows 129人已围观返回

使用VS2008进行调试时,有些变量显示不够直接,需要一层一层的展开才能得到直观的变量内容。虽然不难,但是很影响效率。我们可以通过修改autoexp.dat来修改变量在debug Visualizer的显示。


第一步,打开调试时对变量进行Auto Expand功能


第二步,很关键,也是本文关注的重点。autoexp.dat文件在 VS的安装目录Common7\Packages\Debugger\autoexp.dat中。


autoexp.dat实际是一个ini,要编辑autoexp.dat,可以通过添加变量类型到段[Visualizer]下。


可视化变量调试窗口有三种类型的视图,预览(preview)视图,字符串(stringview)视图和子(children)视图。

比如QString

QString|*::QString{

preview ( [$e.d->data,su])

stringview ([$e.d->data,sub])

children

(

#(

d: $c.d,

[size]: $c.d->size,

[referenced]: $c.d->ref._q_value

)

)

}

需要新增类型 *::QString表示通配带名字空间QtCore::QString。QString则精确匹配QString

大括号需要与类型在同一行,这一点一定要注意,不要换行

接下来据是三种视图,三种视图都是可选。视图内容必须用()包起来,不可省略。视图内的语法参见语法部分。




第三步,编辑完成,保存,启动调试。autoexp.dat就会自动加载。注意,不需要重启VS,只需要重新运行调试即可。


语法知识,个人总结的,因为得到官方的介绍:

$e,$c是预先定义,表示是传给变量可视化调试器的值。用$e和$c都可以,没有区别。但是$c一般都用在container上。

$i是用在#array语句中的一个局部变量,使用了#array后会使用size表达式自动迭代$i

分支语句#if #else:语句必须使用括号包起来,不能省略

井号(#)语句:个人理解是一个串接语句,计算每一个在#('zz',$e.d,3)的变量,然后转为字符串,并串接起来。

#array:显示container的内容。需要提供expr和size表达式。expr就是每一个元素的内容,size就是总共显示多少个元素

通配符(*)的使用:通配符经常用于名字空间通配和模板匹配,匹配上之后,会产生$T1,$T2...之类的类型或者名字空间。类型可以用来做类型转换。比如*::QList<*>匹配上QCore::QList<int>后$T1就是QCore,$T2就是int类型

类型转换:通配到类型后可以使用C格式的强制转换。

注释:只看到单行注释方式,使用分号(;)

还有一种#tree的结构,用来显示层次化的数据结构

附上一个今天做的boost::optional的auto expand描述

boost::optional<*> {

preview

(

#if ($e.m_initialized == false)

(

#("m_initialized = ",$c.m_initialized)

)

#else

(

#("m_initialized = ",$c.m_initialized,

"; value = ", *($T1*)($c.m_storage.dummy_.data))

)

)

children

(


#if ($e.m_initialized == false)

(

#(

[initialized] : $c.m_initialized,

[raw member]: $c.m_storage.dummy_

)

)

#else

(

#(

[initialized] : $c.m_initialized,

[value] : *($T1*)($c.m_storage.dummy_.data),

[raw member]: $c.m_storage.dummy_

)

)

)

}

再来一个QUrl的例子

QUrl|*::QUrl{

preview

(

#( "path=",[(char*)(((QString*)((int)($e.d)+0x20))->d->data),s])

)

children

(

#(

[scheme]: (wchar_t*)(((QString*)((int)($e.d)+0x4))->d->data),

[host]: (wchar_t*)(((QString*)((int)($e.d)+0x10))->d->data),

[path]: (char*)(((QString*)((int)($e.d)+0x20))->d->data),

[username]: (wchar_t*)(((QString*)((int)($e.d)+0x8))->d->data),

[password]: (wchar_t*)(((QString*)((int)($e.d)+0xc))->d->data),

encodedOriginal: $c.d->encodedOriginal,

[query]: (char*)(((QString*)((int)($e.d)+0x18))->d->data),

fragment: $c.d->fragment

)

)

}


QByteArray使用utf8的例子


QByteArray|*::QByteArray{

preview ([$e.d->data,s8])

stringview ([$e.d->data,s8])

children

(

#(

d: $c.d,

[size]: $c.d->size,

[referenced]: $c.d->ref._q_value,

[utf16]: [(wchar_t*)($c.d->data),su],

[ascii]: [$c.d->data,s]

)

)

}


1.打开调试的设置与选项->编辑并继续->启用本机"编辑并继续"

2.打开Common7\Packages\Debugger\autoexp.dat,并在[hresult]前加入需要的代码

3.stlport的autoexp.dat文件地址:http://stlport.svn.sourceforge.net/viewvc/stlport/trunk/STLport/etc/autoexp.dat


参考:

autoexp.dat入门http://www.thecodeway.com/blog/?p=924

visual studio的安装目录D:\Program Files\Microsoft Visual Studio 9.0\Common7\Packages\Debugger\autoexp.dat

Qt定义的autoexp.dat http://code.google.com/p/geneviz/source/browse/trunk/tools/visual+studio/autoexp.dat-qt?r=698

基于CLR的语言可以参考http://msdn.microsoft.com/en-us/library/x810d419%28VS.90%29.aspx

扩展可视化调试变量窗,参考http://msdn.microsoft.com/en-us/library/e2zc529c%28VS.90%29.aspx

boost提供的可视化调试变量文件https://svn.boost.org/trac/boost/wiki/DebuggerVisualizers

http://blogs.msdn.com/b/vcblog/archive/2006/08/04/689026.aspx

发布时间: 8年前Windows129人已围观返回回到顶端

很赞哦! (1)

文章评论

  • 请先说点什么
    热门评论
    128人参与,0条评论

站点信息

  • 建站时间:2016-04-01
  • 文章统计:728条
  • 文章评论:82条
  • QQ群二维码:扫描二维码,互相交流