Visual Studio 2020
为更狂野的概念IDE提供更多狂野的想法。
恒定速度IDE
引言
我们到底想在这里做什么?
我们正在努力展望编码界的斯特拉迪瓦里琴。这样的乐器将把优秀开发人员的水平提升到前所未有的高度。这就是斯特拉迪瓦里琴的作用。
必然地,这样的设备对其使用者做出了各种假设。这里的假设是,面向对象的软件构建很重要。如果执行新类型测试的负担不是太大,那么测试是首选。系统会变得越来越复杂。开发人员希望看到解决方案的薄弱环节,以便对其进行改造。最后,如果应用程序的执行状态作为持久的、可搜索的结构存储,则为调试、优化和提高实现整体质量提供了丰富的新方法。
所以我们已经尝试了一下。所有这些新工具的交互仍然相当粗糙。但我们还没有完成。帮助我们修订和理论化,并成为一个好的意见板。最终,您可能会使用其中一些工具,因为您在2008年(多年前)帮助塑造和形成了它们的设计。
Home
这是一张概览图。
Home | 全知调试器 | 步进器 | 错误陷阱 | 迷你图 | 可视化堆栈 | 类型查找器 |
点击条 | 测试台 | 凹槽 | 引用图 | 连线 | 轨迹 | 活动对象 | 驳船 |
投影仪 | 解决方案资源管理器 | 走查 |
全知调试器
检查基于给定应用程序或测试运行的累积堆栈,以便修复、优化或改进实现。
想象一下应用程序或测试运行期间进行的所有方法调用;将这些调用按顺序排列,您就得到了累积堆栈。我们可以通过选择单个方法调用、选择方法中的一行,然后像往常一样逐步遍历每一行源代码来探索此结构。
不同之处在于,我们可以通过遍历运行历史来找出任何对象如何达到其状态,或者为什么执行了特定行。
截止如果发生异常,我们可能只需要查看最后几个调用。截止限制了可搜索调用的数量。本质上,这是一种优化。
参数小块在方法调用的括号内,一个小图标(称为小块)表示所有参数的值。您可以将鼠标悬停在此图标上以获取一个迷你监视窗口,其中列出了参数(然后您可以选中它以将其添加到主监视窗口)。
返回值小块这些与参数小块的工作方式相同,但用于返回值。
跳线累积堆栈中可能有数百万个调用。在某些情况下,从发生异常的行追溯异常原因可能非常简单。运行线肯定有助于隔离某个值发生变化并最终导致错误状况的确切点。
堆栈倾向于“向下钻取”到复合对象或相关对象,然后“回弹”到更基本的应用程序循环。这种行为在累积堆栈中更为明显,因为它包含运行期间存在的所有向下钻取和回弹,所有瞬态堆栈。
跳线允许我们更好地了解在给定时间点瞬态堆栈是什么样的,为单个方法调用建立根和叶。这使得更容易查看循环的迭代(例如),这样我们就可以检查第二次迭代,而无需遍历第一次迭代产生的所有噪音。
Home | 全知调试器 | 步进器 | 错误陷阱 | 迷你图 | 可视化堆栈 | 类型查找器 |
点击条 | 测试台 | 凹槽 | 引用图 | 连线 | 轨迹 | 活动对象 | 驳船 |
投影仪 | 解决方案资源管理器 | 走查 |
步进器
更有效地遍历累积堆栈,避免不必要的步入。
属性getter的“步入”。
这里最大的问题是深层点表示法
Form.Controls[0].Control.TextModel.Reset();
调试时,这一行会造成“步入”噩梦。通过将所有这些getter分解并将其列为选项,我们提供了一个直接进入“Reset()”的路径,这可能是无论如何都希望的目标,而不会切断getter目标。
每个获取步骤旁边都会出现迷你图样式的形状,显示该属性是对象类型还是原始类型。如果getter包含超出简单字段值返回的代码,则会在形状的左侧绘制一条线。
Home | 全知调试器 | 步进器 | 错误陷阱 | 迷你图 | 可视化堆栈 | 类型查找器 |
点击条 | 测试台 | 凹槽 | 引用图 | 连线 | 轨迹 | 活动对象 | 驳船 |
投影仪 | 解决方案资源管理器 | 走查 |
错误陷阱
通过将编译和异常消息放在上下文中来提高解析速度。
当存在足够的空闲时间可以尝试编译,并且IntelliSense指示源代码应该成功编译时,恒定速度(CV)引擎会编译解决方案。如果不是这种情况,或者开发人员强制编译,则错误陷阱将显示所有编译错误。每个错误都可以点击,并显示源代码行(就像当前的输出窗格一样)。
异常当应用程序或测试运行时,任何抛出的异常都会显示,并突出显示错误行。在此实例中,累积堆栈仍然可用,可用于追溯异常原因。
这是一个巨大的生产力突破——瞬态堆栈通常在第一次出现意外异常时被丢弃(以便可以设置适当的断点),有时该堆栈仍然无法显示可能甚至早于断点发生的问题。
Home | 全知调试器 | 步进器 | 错误陷阱 | 迷你图 | 可视化堆栈 | 类型查找器 |
点击条 | 测试台 | 凹槽 | 引用图 | 连线 | 轨迹 | 活动对象 | 驳船 |
投影仪 | 解决方案资源管理器 | 走查 |
迷你图
可视化地描绘类型的实现。
迷你图用于可视化堆栈和可视化重构。
矩形表示对象或类型。然后添加其他形状
属性旨在表达读/写能力,并指示是否存在超出简单setter或getter行的代码。
读取形状放在左侧,写入形状放在右侧。如果存在附加代码,则从值形状的边缘到椭圆的边缘绘制一条线。
成员的作用域由其在矩形中的位置显示。公共成员突出显示在外部边缘。内部成员出现在矩形内部的私有或受保护区域中。
用法
将鼠标悬停在形状上会使形状“变热”,并显示一个标签,其中包含成员名称并列出任何参数。
成员通常通过悬停检查,拖到监视窗口或选择(如果正在重构)。
在可视化堆栈中,蓝色高亮效果在迷你图之间形成弧线,指示方法调用顺序。
技术说明迷你图旨在由软件生成,因此,它们遵循标准(例如,超出一定数量的参数或成员时使用省略号)以协助该应用程序。
Home | 全知调试器 | 步进器 | 错误陷阱 | 迷你图 | 可视化堆栈 | 类型查找器 |
点击条 | 测试台 | 凹槽 | 引用图 | 连线 | 轨迹 | 活动对象 | 驳船 |
投影仪 | 解决方案资源管理器 | 走查 |
可视化堆栈
将堆栈表示为一系列连接的迷你图,以显示对象复杂性并即时访问对象状态。
单击橙色方块以查看对象类型的固态监视窗口。通过将形状从迷你图拖到监视窗口来定义新的监视。
Home | 全知调试器 | 步进器 | 错误陷阱 | 迷你图 | 可视化堆栈 | 类型查找器 |
点击条 | 测试台 | 凹槽 | 引用图 | 连线 | 轨迹 | 活动对象 | 驳船 |
投影仪 | 解决方案资源管理器 | 走查 |
类型查找器
一键创建新类型,从最近选择的类型中选择,根据名称、引用类型、实现的接口、祖先类型和其他元数据搜索类型。
搜索语句可以过滤所有类型,使其成为合理的子集。
这里的关键是提供一组完整的良好默认语句,以便开发人员可以使用下拉列表。如果默认值不足,则可以构建和保存高级语句。
搜索语句规范显示
所有/类/委托/结构/接口/枚举
在解决方案/项目/命名空间/文件夹中
以/包含/结尾
派生自该类型
实现该接口
包含该属性/方法/属性/事件
从这个规范构建语句,我们有
当然,在列表中输入会使选择跳转到第一个匹配的类型。因此,对于小型项目,搜索语句可能会保留在“显示项目中所有类型”上。
新类型图标与“添加新项 | 类”相同,只是没有对话框。“新类型”模板应可由开发人员编辑。
MRU图标显示此解决方案最近选择的类型的弹出窗口。
Home | 全知调试器 | 步进器 | 错误陷阱 | 迷你图 | 可视化堆栈 | 类型查找器 |
点击条 | 测试台 | 凹槽 | 引用图 | 连线 | 轨迹 | 活动对象 | 驳船 |
投影仪 | 解决方案资源管理器 | 走查 |
点击条
使其易于查看和导航到当前类型直接引用的类型。
选择类型时,代码编辑器上方的此标题区域会显示类型列表。单击其中一个以查看该类型的源。双击其中一个以更新查找器中选择的类型并强制重新填充条带。
这里的目的是加快导航到相关类型的速度,而无需开发人员在源代码中查找引用。此条带还提供了对引用类型的实际检查,计数越高越不理想。
Home | 全知调试器 | 步进器 | 错误陷阱 | 迷你图 | 可视化堆栈 | 类型查找器 |
点击条 | 测试台 | 凹槽 | 引用图 | 连线 | 轨迹 | 活动对象 | 驳船 |
投影仪 | 解决方案资源管理器 | 走查 |
测试台
一键创建新测试,从最近选择的测试中选择,根据名称、足迹、引用类型和其他元数据查找现有测试。
根据需要或在编辑这些行时,自动列出与给定一行或多行源代码相关的测试。
测试推荐器在测试台内部实现,因此当源被编辑时,列表会简单地更新。随着越来越多的源被更改,通常会期望列表增长。通常具有绿色状态的测试,当任何底层源被更改时会变为黄色。当更改可以编译时,CV引擎会编译测试,运行测试,并设置状态。
新测试图标单击此图标以创建新测试。解决方案始终具有定义的默认测试项目。测试的代码文件会自动添加到此项目中。测试还会被赋予一个序列号。测试的描述可以在列表或测试台顶部的描述区域中输入。
MRU图标单击此图标以显示最近选择的测试列表。
搜索语句过滤搜索语句是类似英语的短语,带有可替换的单词。这些可以连接在一起形成一个完整的搜索段落。一旦构建了搜索,它就会被保存并可以命名。搜索语句按项目保存,可以通过下拉菜单选择。
这里的目的是允许通过预定义甚至自定义元数据(例如属性)进行快速简单的搜索。
测试状态状态为
单元测试支持的第一种测试类型是单元测试。当然,底层框架应该易于与目前流行的测试框架(如NUnit)集成。
应用程序测试简单的单元测试不足以进行全面的QA——应支持应用程序(功能)测试。可扩展架构在这里也很重要,因为各种现有测试应用程序都希望集成。
最重要的是,应提供对应用程序录制器/回放样式实现的全面支持。
双向录制在此功能的最高质量实现中,录制将表示为托管类型的源,使录制可直接编辑。
足迹这是一种与测试相关的特殊元数据。足迹是在测试运行期间执行的每一行源代码的列表。测试台中的搜索语句控件提供了一个选项,可以查找所有具有相同足迹的测试。然后可以轻松删除冗余测试。
Home | 全知调试器 | 步进器 | 错误陷阱 | 迷你图 | 可视化堆栈 | 类型查找器 |
点击条 | 测试台 | 凹槽 | 引用图 | 连线 | 轨迹 | 活动对象 | 驳船 |
投影仪 | 解决方案资源管理器 | 走查 |
凹槽
直接在源代码中以图形方式汇总代码指标。
凹槽可以通过代码编辑器中的弹出菜单访问。选择“凹槽 | 显示所有”以显示所有凹槽,或选择单个凹槽。
当鼠标悬停在凹槽上时,它会展开,从而更容易在特定源代码行的图表上移动。
右键单击图表会导致显示基础统计值,或者在某些情况下,显示一个完整的列表视图。
预定义凹槽包括
测试 - 与此源代码行关联的测试数量。此列表可以传输到测试台。
运行 - 该行已运行的次数(在当前解决方案中)。
异常 - 直接从该行抛出异常的次数(而不是较低级别的源代码)。
时间 - 源代码存在的时间。即使通过剪贴板操作也应保持。
编辑 - 此行已更改的次数。
调用(仅方法) - 当前解决方案中调用此方法的次数。提供了调用者列表。
创建(仅类型) - 当前解决方案中实例化此类型的次数。提供了列表。
图表凹槽统计数据根据一组预定义规则进行汇总。这些规则可以由开发人员修改。目的是一目了然地显示统计数据的理想性。
当然,凹槽的实现方式应该允许它们扩展,并且可以根据现有元数据或新的元数据组合定义新的凹槽。
凹槽绘制架构也应该是可插拔的,这样这些图表就可以轻松替换。
Home | 全知调试器 | 步进器 | 错误陷阱 | 迷你图 | 可视化堆栈 | 类型查找器 |
点击条 | 测试台 | 凹槽 | 引用图 | 连线 | 轨迹 | 活动对象 | 驳船 |
投影仪 | 解决方案资源管理器 | 走查 |
引用图
确定源代码中一个类型引用另一个类型的确切位置。
引用以两种不同的方式进行汇总,要么通过突出显示的迷你图(其中包含引用的部分被突出显示),要么通过行号列表。您可以单击其中任何一个以跳转到引用。
依赖嵌套如果引用流向其他类型,则提供这些类型的列表。因此,您可以查看依赖关系的深度。
源项目符号源代码本身在每个引用处都带有项目符号。
Home | 全知调试器 | 步进器 | 错误陷阱 | 迷你图 | 可视化堆栈 | 类型查找器 |
点击条 | 测试台 | 凹槽 | 引用图 | 连线 | 轨迹 | 活动对象 | 驳船 |
投影仪 | 解决方案资源管理器 | 走查 |
连线
线路帮助我们跟踪单个对象的字段、属性或事件的更改,回答以下问题:这个值何时更改?
您可以右键单击引用相关字段、属性或事件的源代码行来运行线路。截至此代码行的所有更改都将收集到一个列表中。然后您可以从该列表中选择以显示发生更改的方法。值更改的源代码行将突出显示。
堆栈着色活动线路中涉及的方法在累积堆栈中着色。
注意请记住,线路是基于实例的。只跟踪您在堆栈中找到的字段或对象的更改,而不是该字段或类型的所有实例。
Home | 全知调试器 | 步进器 | 错误陷阱 | 迷你图 | 可视化堆栈 | 类型查找器 |
点击条 | 测试台 | 凹槽 | 引用图 | 连线 | 轨迹 | 活动对象 | 驳船 |
投影仪 | 解决方案资源管理器 | 走查 |
轨迹
根据每行源代码所需的CPU时间列出源代码行。
Trax突出显示上次运行期间执行的每一行源代码,使其易于区分执行的行和未执行的行。这与Stack Trax不同,后者仅突出显示选定调用的执行行。Trax是累积的,突出显示运行期间在任何时间点触发的每一行。
使用摘要找到最耗时或最嘈杂的方法。选择一个方法,SubTracker将显示该方法中所有耗时的调用。然后选择SubTracker中的一个方法或单击代码编辑器中的“项目符号”以继续向下钻取。
累积堆栈Trax模式当Trax可见时,累积堆栈分为多个部分,每个部分都包含所有导致调用所选方法的调用。这有助于隔离每个调用的“原因”。
使用Trax模式箭头在调用实例之间导航。
Home | 全知调试器 | 步进器 | 错误陷阱 | 迷你图 | 可视化堆栈 | 类型查找器 |
点击条 | 测试台 | 凹槽 | 引用图 | 连线 | 轨迹 | 活动对象 | 驳船 |
投影仪 | 解决方案资源管理器 | 走查 |
活动对象
列出截至给定源代码行存在的对象。
这个相当简单的列表视图不会有什么大不了的,除了有一点——它在您单击累积堆栈时更新。这意味着您可以评估任何调用的总对象足迹——这应该会带来一些非常令人难以置信的优化机会。
请注意列表底部的总内存使用量。此统计信息实际上可以在累积堆栈顶部的搜索语句控件中搜索。然后您可以过滤堆栈,只显示内存使用量大于1MB时正在运行的那些调用。基于LiveObjects从堆栈进行元数据搜索的可能性既诱人又无限。
起源找到实例化对象的源代码行。
当您看到高对象计数时,第一个问题通常是:“谁”在创建所有这些对象。这个小列表视图会分解负责实例化给定对象类型的确切源代码行。只需单击LiveObjects中的对象类型,然后单击Origins中的一行:源代码就会显示在代码编辑器中。
注意:括号仅显示用于构造函数。
Home | 全知调试器 | 步进器 | 错误陷阱 | 迷你图 | 可视化堆栈 | 类型查找器 |
点击条 | 测试台 | 凹槽 | 引用图 | 连线 | 轨迹 | 活动对象 | 驳船 |
投影仪 | 解决方案资源管理器 | 走查 |
驳船
列出截至给定源代码行已进行垃圾回收(或符合回收条件)的对象。
当您遍历堆栈时,应根据实现发生一定数量的回收资格。这里最大的好处是——立即发现膨胀。
膨胀也会出现在LiveObjects窗口中,尽管会略微掩盖,因为好的对象与要回收的对象混合在一起。
有一点是肯定的,如果您选择堆栈的最后一行并且驳船是空的,那么您的应用程序从未允许单个对象进行垃圾回收!
起源即使对象已被垃圾回收,也要找到实例化对象的源代码行!
当然,如果您回到那一行,然后您可以逐步查看它再次被创建。
注意:括号仅显示在构造函数上。
Home | 全知调试器 | 步进器 | 错误陷阱 | 迷你图 | 可视化堆栈 | 类型查找器 |
点击条 | 测试台 | 凹槽 | 引用图 | 连线 | 轨迹 | 活动对象 | 驳船 |
投影仪 | 解决方案资源管理器 | 走查 |
投影仪
管理主项目、源项目和测试项目。
为了支持轻松创建测试,可以设置默认测试项目。然后在测试台中创建的任何测试都会自动添加到此项目中。
TDD通常需要多个测试项目。Projector使得创建新测试项目并将其设置为默认项目变得容易。
构建条当有多个项目参与时,构建顺序是正确依赖关系的最佳指示。该条带还支持单击即构建的单次构建,这样您就可以检查项目的编译,而无需将其包含在依赖项中或检查解决方案配置中的构建。(未设置为构建的项目不会由CV引擎编译。)
项目编辑器 新建项目图标 最近使用图标 类型计数图反映项目中类型的数量。
这些计数范围可以由开发人员编辑。还可以为每个项目类型创建自定义范围表。
Home | 全知调试器 | 步进器 | 错误陷阱 | 迷你图 | 可视化堆栈 | 类型查找器 |
点击条 | 测试台 | 凹槽 | 引用图 | 连线 | 轨迹 | 活动对象 | 驳船 |
投影仪 | 解决方案资源管理器 | 走查 |
解决方案资源管理器
快速选择旧解决方案或创建新解决方案。
创建新解决方案。
MRU图标显示最近选择的解决方案的弹出窗口。
解决方案编辑器配置工作区中的解决方案
设置解决方案的源文件夹。
选择将构建哪些项目。
为每个项目设置输出类型。
为每个项目设置输出路径。
更改每个项目的输出文件名。
这些功能与Projector重叠。这里的主要目的是获取所有项目设置的概述。
Home | 全知调试器 | 步进器 | 错误陷阱 | 迷你图 | 可视化堆栈 | 类型查找器 |
点击条 | 测试台 | 凹槽 | 引用图 | 连线 | 轨迹 | 活动对象 | 驳船 |
投影仪 | 解决方案资源管理器 | 走查 |
走查
在这里,我们逐步讲解一个简单的开发周期,展示CV引擎如何支持测试驱动开发。
Home | 全知调试器 | 步进器 | 错误陷阱 | 迷你图 | 可视化堆栈 | 类型查找器 |
点击条 | 测试台 | 凹槽 | 引用图 | 连线 | 轨迹 | 活动对象 | 驳船 |
投影仪 | 解决方案资源管理器 | 走查 |