说明
此篇为GitHub上的OzCodeDemo,可以从上面下载Demo查看,Demo中用例子详细讲解了OzCode的各个功能。
这里还有一篇对OzCode各功能的大致说明,来自于OzCode官网上的功能介绍。
这里有一个好东西。
本篇文章编写时间为2019年4月14日,对应4.0.0.557版本。
文章目录
- Reveal(显示、加星标)
- Search(查找、搜索)
- Show All Instances(显示所有实例)
- Setting Conditional Breakpoints(设置条件断点)
- Exception Trail(异常跟踪)
- When Set... Break
- Filter Collections(过滤集合)
- Trace(追踪)
- Magic Glance(魔术一览)
- Predict the Future(预测未来)
- Custom Expressions(自定义表达式)
- Export(导出)
- LINQ Debugging(LINQ 调试)
- Compare Instances(比较实体)
该仓库包含几个开源演示,展示了OzCode的功能。 我们的目标是帮助用户探索OzCode,并了解它如何增强Visual Studio的调试。
每个文件夹都包含一个演示和一个易于理解的文本,该文档将解释有关该功能的更多信息,并显示常见用例。
Reveal(显示、加星标)
专注于真正重要的数据。
对象可以有许多属性,但在调试时,并非所有属性都对您有用。 您通常只对几个特定的属性感兴趣。 对于Customer类,它可能是ID和Username属性,对于3D空间中的Point类,它可能是X、Y和Z字段。 通过OzCode的“显示”功能,您最终可以专注于实际重要的数据。
点击Demo中如下图的“Reveal”按钮可以运行此演示示例。
请注意,已触发了断点。 似乎虽然我们的方法只能用于往海外(除美国外的海外)发送包裹,但不知何故,我们得到了一个应该使用本地运输方式运送的包裹:
因为没有人在Customer类上实现ToString而感到很烦恼,一开始HUD将使用默认的ToString实现,它只显示了类型名称,明显不是很有用。 此外,遍历DataTip中的Customer类可能很痛苦,因为它包含了很多字段。
将鼠标悬停在customer上以显示DataTip窗口。 然后使用’+'展开customer字段。
最后找到“FirstName”并点击旁边的“star”:
注意DataTip窗口和HUD如何相应更新:
类似的也可以使用星号添加“SurName”属性。
现在使用Call Stack Window返回方法的调用者,再次使用DataTip查看有多少Customer来自Paris(包括Jose Duke)。 由于它们都是Customer类的实例,因此我们之前用星号标记的FirstName会自动显示。
让我们为每个customer添加更多信息:从DataTip窗口展开其中一个custom,然后展开Address属性并为Country,State和City属性加注星标。 最后打开Address旁边的星号 - 以便将Address信息显示为Customer的一部分(使得更容易查看嵌套信息!)。
折叠当前customer并查看customer列表:现在我们可以看到所有选定的Customer及其地址。
找到错误和受影响的Customer应该变的很简单。
Search(查找、搜索)
在茫茫数据中找到它。
调试对象和集合时,通常会查找特定属性或字段,或者属性或字段中保存的值。 不幸的是,这通常涉及大量点击和滚动,或编写自定义调试特定代码。 即使在简单的结构中查找项目也不容易,更不用说在复杂的对象图中这样做了。 通过我们的“Search”功能,情况不再如此。 无论对象的大小或对象图的复杂程度如何,都可以快速轻松的搜索成员名称和值!
在此Demo中,我们将尝试找出与托管可扩展性框架(或MEF)有关的问题,该框架是.NET的一部分,使开发人员能够使用插件架构构建可扩展的应用程序,并且行为有点像依赖注入容器。 可能您已经注意到,我们的整个OzCode演示应用程序都建立在MEF之上!
点击Demo中如下图的“Search”按钮可以运行此演示示例。
立即弹出一个抛出异常的消息框:
No!这意味着发生了MEF故障,因为我们错误地在同一接口下注册了两个或更多不同的服务。 因此,当我们要求MEF为我们提供实现ITestComponent接口的接口时,MEF不知道要给我们哪个实现!
由于我们想在抛出异常时中断执行,我们有两个选项 —— 可以使用Visual Studio的内置异常设置对话框,或者只需按“Break on all CLR excetions”按钮:
再次运行Demo —— 这次调试器将在抛出异常的行上中断。
将鼠标悬停在container变量上,将弹出DataTip窗口。 单击DataTip底部的Search文本框,然后写下“Test”以搜索其中包含单词“Test”的对象/属性。 默认情况下,搜索将同时查看字段和属性的名称以及它们各自的值!
container内有两个名称非常相似的组件,但为了确认,我们需要深入挖掘。 再次搜索,这次寻找ITestComponent。
起初没有结果显示。 点击“Search deeper”按钮以显示在ITestComponent合约下注册的组件。 每次单击“Search Deeper”时,OzCode都会扩大搜索范围,并在对象图中更深入地查看两个级别。
Show All Instances(显示所有实例)
在内存中查找要探索的特定对象。
OzCode使得在内存中找到您想要探索的特定对象变得微不足道。 只需打开“Show All Instances of Type(显示所有的类型实例)”,您就可以看到当前在内存中的该类型的每个对象。 为什么那个对象仍在内存中? 是否有任何包含此值的对象? OzCode令人兴奋的新探索工具毫不费力的立即回答了这些问题以及更多问题。
点击Demo中如下图的“Show All Instances”按钮可以运行此演示示例。
立即弹出一个抛出异常的消息框:
信息量不大,我们需要进一步研究这个问题。
为了理解问题,我们需要在抛出异常时中断,可以使用Visual Studio的内置异常设置对话框,或者只需按“Break on all CLR excetions”按钮:
重新运行Demo —— 您应该在调用SendInvoice时中断:
快速检查后应该显示此方法调用的问题 —— customerEmail为null,这不应该发生。
不幸的是InvoiceService的实现使我们很难找到导致问题的Customer。 虽然我们可以通过添加check来快速解决这个问题,但我们仍然需要找到有问题的customer!由于我们只有invoiceID,我们可以使用OzCode的Search来查找它。