使用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 ) ) }
第三步,编辑完成,保存,启动调试。autoexp.dat就会自动加载。注意,不需要重启VS,只需要重新运行调试即可。
语法知识,个人总结的,因为得到官方的介绍:
附上一个今天做的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] ) ) }
参考: