title

(本文约 5400 字,阅读时间约 15 min)

Visual Assist 多年来始终是 Visual Studio 开发环境下的一款难以逾越的经典辅助插件。难得的是,这些年来它的重心一直围绕着 C++ 程序的编写辅助和增强。近年来,逐渐开放的微软加快了 Visual Studio 的演进速度,持续地吸收了不少 VA 的特性,但多年的积累使得 VA 的对应实现仍有着很强的竞争力。就拿代码重构里最基本的“重命名”来说,VA Rename 就比 VS Rename 步骤更少,速度更快,也更为方便和顺手一些。

在上个月偶然间了解到新加的静态分析功能之后,我这两天下载了最新版本的 VA,发现比自己用了好一阵的老版本多了不少新东西,就想试着集中梳理一下。这篇文章里,那些经典功能如符号查找 (Find Symbols / Find References),函数列表 (List Methods in File),代码片段 (VA Snippets) 我就不再多说了,只是对相对较新的特性和技巧做了整理。

特性和功能

Code Inspection 静态分析和快速修正

VA 开始支持基于 LLVM/Clang 的代码静态分析了。与 VS 原生的 Code Analysis 不同的是,VA 支持直接一键修复提示的问题。

ci1

可以在汇总窗口里查看所有静态分析时找到的问题。

ci2

并选中关心的项目,右键 “Apply Quick Fixes” 修复。

ci3

对那些不关心的项目,也可以在选项里关掉单条提示类型,或是调整它们所在的 Level (就像 Warning Level 那样)。

ci4

Debugging - VA Step Filter

可以显式指定调试的时候自动跳过的函数 (比如标准库的函数 std::sort()),比 VS 自带的 autoexp.dat 好用很多

  • 可随时把当前函数添加到过滤列表,并即时生效
  • 可随时开启关闭任意一个指定的函数 (就像开启关闭一个或多个断点)

stepFilterBuiltInFilters

Debugging - Address Resolver

当 callstack 仅包含地址信息时,可以用这个工具来还原堆栈。

addressResolver

关于定位 pdb,基址设置等方面更多的技巧在这里

Debugging - Pdb Explorer

这个工具可以查看,搜索和定位 pdb 内的符号。

pdbExplorer

在调试的时候,可以直接把特定的符号拖到 Disassembly 窗口,非常方便。

explorerGoto

此工具更多的信息在这里

Debugging - Memory View

用来调试 Dump 的内存查看窗口,可以显示特定的地址处的情形,通常配合 Disassembly 窗口和 Memory 窗口使用。

vaMemoryViewDissasembly

此工具更多的信息在这里

快捷键设定窗口

这个全新设计的面板列出了 VA 的所有快捷键及作用域,并可以跳转到 VS 的设置面板上去修改。

hotkey

但是我实际上很少更改默认的快捷键设置,因为工作需要,会需要在不熟悉的机器上的 VS 内工作,如果自己的快捷键是定制的,就常常会遇到肌肉记忆不断失败的情况。总是用默认的快捷键位就可以避免这一点。

技巧

开启 Ctrl + 鼠标滚轮对 Smart Select 的支持

在新版的 VA 的选项 Options | Mouse 中找到下面两项并按照下图中的方式选择

mouse

我们知道 Ctrl + 鼠标滚轮本来是用来即时调整字体大小的,但实际上很少会如此频繁地去放大和缩小代码的字体,有时候还容易造成误操作。换成 Smart Select 之后就可以非常快捷地选择光标所在的代码块了,比如说你的光标在下面的代码段里注释所在的地方:

vaSmartSelect

那么按下 Ctrl 后,随着滚动鼠标滚轮,你会选中 if 的所有代码,继续滚动的话,接下来是 for 的所有代码,然后逐级向上,DoSomething,Bar,Foo,最后是整个文件。(选中顺序与图中左侧折叠代码块的 Outlining Bar 保持一致)而反向滚动则会逐级退回。熟练以后你会发现这个功能非常好使,会很少再需要手动去掐头去尾,选中一段代码了。

VA Hashtags 增强注释——可跳转可聚合的代码内书签

比书签 Bookmark 更好的是,hashtags 是代码的一部分,所有人共享并签入版本库,可跳转,相同的 tag 自动聚合到一起。

vaHashtags

可以快速标出某个常用代码的位置 (如 main() 函数的位置):

hashtagMain

可以交叉引用并跳转:

hashtagSeeDoSomething

可以在窗口内管理,搜索,分组和隐藏:

commaHash

这个功能特别灵活,它本质上是对一堆信息做最小组织 (minimal-structuring) 的过程,特点是即使数据量再大也始终能保持最小的维护负担

其实我们日常信息处理时,有很多分组/分目录都不合适的情况——比如发过的所有的朋友圈,只需要在单条记录内任意位置打上 #旅行 / #摘抄 / #笔记 等等… 假如朋友圈支持按照 hashtags 聚合,就可以一键找到所有的相关项。

我的日常日志也依赖这类标记,比如 #电影 #2016 就可以一下找到我 2016 年看的所有电影。

总的来说我现在非常偏爱这一类平坦组织结构,无需额外的抽象 (abstract) 和层次 (hierarchy),不用成天纠结分组/分类等问题,比树状的类文件夹系统实用和轻便很多。

Flat is better than nested.

VA Outline 大纲视图的快捷操作

这个视图浓缩了当前文件的大纲,便于随时跳转和审视整体结构。

vaOutline

可以直接在这个视图上拖拽来挪动代码块。

vaOutline2

也可以直接在这个视图上选中一个或多个 block,右键执行各类重构命令,或者整体注释。

vaOutline3

这个窗口本质上是把单个的代码块原子化了,简化了操作步骤,也避免了很多误操作。

更多的小技巧

  • Goto Related 跳转到相关的各类符号 (声明/类型/使用地点) 是 Goto Implementation 的增强版
  • Clone Find References Results 可以将查找结果复制到独立窗口,这一过程可重复产生多个窗口,不像 Find in Files 只允许两个结果窗口
  • 一些用起来很顺手的文件操作相关的重构

    • Rename Files... 一键重命名同名的 .h/.cpp
    • Move Selection to New File... 一键把选中的代码挪入新文件
    • Move Implementation to Source File / Header File 太常用不解释了
  • 大项目会产生若干 GB 级别的缓存文件,可以使用 Options | Clear 来清理这些磁盘空间

  • 有时在代码库里做了较大的更新之后,会出现新版本的代码下缓存失效没有及时更新,导致一些功能不起作用的情况。这时使用 Options | Rebuild 可以重建符号数据库(注意,上面的 Clear 不会影响符号数据库

  • 如果VS没有安装在固态硬盘,把 VA_X.dll 的目录 mklink /j 符号链接到 ssd 上面会快很多。(谢谢评论中 Tyung 同学的补充)

能看到这里说明你一定是真·VA粉了,如果你有什么独门技巧,欢迎在留言里与大家分享~ [抱拳]

(完)

Gu Lu

[2017-04-15]


  • [2017-04-29] posted (.5h)
  • [2017-04-16] revised (.5h)
  • [2017-04-15] initially written (3h)

Comments
Write a Comment
  • 感谢分享!已推荐到《开发者头条》:https://toutiao.io/posts/6et3vl 欢迎点赞支持!

    欢迎订阅《游戏开发杂货铺》https://toutiao.io/subject/528

Tags

游戏开发   随笔   Programming   C/C++   优化   Unity   C++   知乎   游戏设计   比特币   Unity3D   区块链   软件开发   引擎设计   系统架构   Production   idtech   中国文化   加密货币   项目管理   Bitcoin   游戏评论   资源管理   资源流水线   效率   道德经   网络   方法论   模板编程   Lua   Oculus   GDC   渲染   VR   PerfAssist   Unity MemoryProfiler   BCH   经济学   信息过载   行业报告   字体   Productivity   图形   网络编程   Dice   协程   EMC   Premake   测试   中间件   Game Engine   新手引导   Methodology   CI   命令行解析   goroutine   ndk   Ethereum   nanomsg   自动化   Scripting   摘录   Debugging   同步技术   cppcon   C++模板   DOOM3   技术评估   Unity GC   C++11   学习方法   Surface Pro 3   Engine Evaluation   CRT   文化   Blockchain   笔记   golang   图形编程   多线程   ETH   Blockchain Computing   Bitcoin Cash   cppcon14   Bitcoin SV   Visual Studio   Unity Coroutine   跨语言可变参数列表   团队协作   货币   Deployment   Visual Assist   工程改进   Michael Abrash   exp   开放世界   域名   虚拟现实   系统重构   slua   遮挡剔除   完美转发   协作式调度   Modern C++   类型推导   Memory Debugging   个人成长   小故事   BTC   暴雪   产品   历史   错误处理   Unity Profiler   MOD  

知识共享许可协议
本作品由Gu Lu创作,采用知识共享Attribution-NonCommercial-NoDerivatives 4.0 国际许可协议进行许可。