说明
此篇为OzCode官网上的功能介绍。
这里对OzCode提供的各类功能大概介绍了一番。[这里]还有一篇对OzCode各功能的详细说明。
这里有一个好东西。
本篇文章编写时间为2019年4月12日,对应4.0.0.557版本。
文章目录
- LINQ Debugging(LINQ 调试)
- Numeric Indicator(数值显示器)
- LINQ DataTip(LINQ数据提示)
- LINQ Analysis Window(LINQ分析窗口)
- Understanding Exceptions in LINQ queries(了解在LINQ查询中的异常)
- Fluent and Query Syntax Support(流畅Lambda和查询语法支持)
- Export(导出)
- Heads Up Display(头部显示)
- Investigate(追查、考察、探究)
- Explore History(探索历史)
- Magic Glance(魔术一览)
- Predict the Future(预测未来)
- Live Coding(实时编码)
- Breakpoints(断点)
- Exceptions(异常)
- Trace(追踪)
- Quick Attach(快速附加)
- Search(查找、搜索)
- Foresee(预知)
- Compare(比较)
- Reveal(显示、加星标)
- Custom Expressions(自定义表达式)
- Filter Collections(过滤集合)
- Quick Actions(快速操作)
- Show All Instances(显示所有实例)
- Time Travel Debugging(时间旅行调试)
LINQ Debugging(LINQ 调试)
(点击此处了解更多详细信息)
LINQ太棒了。 它允许我们编写功能强大,简洁且富有表现力的代码,这些代码非常适合阅读和维护。 唯一的问题是使用LINQ意味着牺牲代码的可调试性以实现可读性。 如果您使用F10跳过了一行使用LINQ的代码 —— 您刚刚执行了一大堆复杂的逻辑,但您完全没有了解实际发生的事情。 在调试LINQ时,使用断点和手动一行一行调试可能是徒劳的浪费时间。 OzCode突破性的LINQ调试可视化使您可以查看不同条目是如何通过LINQ途径传递的,并查看每个lambda表达式的返回值,同时可以利用强大的OzCode工具,如Reveal和Search。 注意:仅在VS2015及更高版本中支持LINQ调试。 .NET Core尚不支持,但支持即将推出。
Numeric Indicator(数值显示器)
在调试期间,当执行点(黄线)到达LINQ查询时,每个LINQ运算符旁边会出现一个指示符,表示它生成了多少项。
一目了然每个操作符筛选了多少条目,生成了多少条目,帮助您决定关注哪个操作符。
LINQ DataTip(LINQ数据提示)
单击其中一个数字指示器,将OzCode置于LINQ调试模式,并打开LINQ DataTip窗口,该窗口显示给定操作符生成的条目。 您可以点击DataTip中的“前/后”按钮来快速切换生成的条目和传入该操作符的条目。
单击其中一个条目将更新Head-Up Display(下文有介绍,在此处简单说就是显示在每句上面的那个值,比如上图中的“3”“Fizz”“1,2,Fizz”),来反映每个lambda返回的通过LINQ传递的特定条目。 另一种选择是在鼠标悬停在数字注释上时使用鼠标滚轮快速滚动条目,可以看到它们的值在调试代码中立即改变。
LINQ Analysis Window(LINQ分析窗口)
可以从DataTip窗口打开详细的分析工具窗口,也可以单击调试查询左侧的lambda图标:
您可以使用Search和Reveal查找感兴趣的对象,也可以使用“operator breadcrumbs”(也就是上图中顶部显示“Source”“Where”“Select”等的那栏)在LINQ之间导航,并利用动画可视化LINQ查询的流程。
Understanding Exceptions in LINQ queries(了解在LINQ查询中的异常)
难题之一是要解决在复杂的LINQ查询中从深处抛出的异常 —— 这几乎是不可能调试的。 通过红色高亮显示的LINQ数字指示器,OzCode会在它被抛出之前警告您这样的异常,让您使用LINQ DataTip或LINQ分析窗口深入研究,以找出导致该异常的确切条目!
Fluent and Query Syntax Support(流畅Lambda和查询语法支持)
使用LINQ查询、过滤和转换集合时,开发人员可以选择两种类型 —— 基于lambda的流畅API或类似SQL的查询表达式。 选择使用哪种语法取决于个人偏好以及问题的性质。 流畅的lambda语法更简洁,在简单查询时往往更可取。 但是,使用查询语法可以更容易地表达一些更复杂的查询,这允许您利用“let”关键字和多个“from”子句来处理复杂数据。 OzCode完全支持LINQ的这两种风格。 当您使用查询语法时,OzCode将直观地突出显示哪些项来自哪个“from”子句,每个项的“let”表达式计算的值等等!
Export(导出)
(点击此处了解更多详细信息)
导出允许您将对象实例的文本表现保存到文件或剪贴板,以便在调试会话结束后继续使用。
使用Export,开发人员可以“抓取”对象并将其保存为JSON、XML、甚至C#代码,可用于使用上次调试运行的值创建单元测试。
保存导出的实例(或将其复制到剪贴板)后,可以使用它来重现实例状态,使用外部差异工具进行分析或比较。 对于JSON输出,OzCode使用行业标准的Newtonsoft Json.NET序列化程序,这使得反序列化和处理结果非常容易。
Heads Up Display(头部显示)
Investigate(追查、考察、探究)
调试复杂表达式绝非易事。 您如何看待方法调用返回的内容? 在一个冗长的复杂if语句中,每个布尔条件的值是什么? 如果不简化代码或添加变量来存储单个结果,则难以回答这些问题。 借助OzCode强大的“简化”可视化功能,您可以立即弄清楚代码中发生了什么! 单步执行表达式时,红色/绿色的背景颜色将分别告诉您哪些表达式返回false / true。前面的红色或绿色
表示整个表达式的结果。
只需点击“简化”按钮,表达式即时可视化,您可以选择深入研究并查看单个表达式结果。
Explore History(探索历史)
关于“简化”最好的一点是,您可以看到代码执行的历史视图。 每次跳过(F10)一行代码时,都会出现一个新的简化按钮,让您可以回顾过往! 如果您跳过的太多,您不再需要重新启动调试!“ 简化上下定位键盘快捷键”,如果用键盘操作,我们为您提供了一些有用的快捷方式,让您在不抬起手掌的情况下进行上下定位:点击“Alt+Q”可视化当前行,然后使用“Alt+↑”可视化当前行或“Alt+↓”在不同的代码行之间导航。您也可以在调试时按住“Alt”键,然后点击一个数字“1 - 9”直接选择要显示的语句。
Magic Glance(魔术一览)
(点击此处了解更多详细信息)
Magic Glance可通过单击工具栏的图标(或按“Shift+Alt+Q”快捷键)切换,通过向您显示所执行的每行代码的摘要,为您提供对代码更深入的了解。
Predict the Future(预测未来)
(点击此处了解更多详细信息)
OzCode v2.0会对代码的执行进行预测分析(或者我们喜欢称之为:算命!)。 在下面的switch语句中,OzCode将会预测未来:当我们点击F10时,您可以看到箭头指向我们要去的地方,并且不相关的代码是半透明的。
Live Coding(实时编码)
Predict通过为您提供调试时所做更改的即时反馈,为术语“实时编码”带来了新的含义,使您能够非常快速地修复愚蠢的小编码错误。 如果您正在使用VS2015,Predict甚至可以预测更复杂的表达式,例如LINQ查询:
Breakpoints(断点)
Conditional Breakpoints(条件断点)
(点击此处了解更多详细信息)
条件断点可以使调试更有效率,但没有OzCode,使用它们就像是一件苦差事。 OzCode使添加条件断点非常容易! 只需单击一下,OzCode就会根据特定的属性值设置条件断点,并为您预填充谓词。
想要在断点处添加更多谓词吗? 走捷径! 只需将鼠标悬停在相关变量上,然后单击“Add Condition(添加条件)”按钮。
When Set… Break
(点击此处了解更多详细信息)
最难解决的问题是那些涉及变化状态的错误。 如果在程序执行期间的某个时刻某些对象的状态变得无效,您怎么办?但是您不确切知道它到底是什么时候以及在哪里变化的? 在检查调试器中的值时,当您发现有问题的属性值时,请使用魔术棒并选择“When Set – Break”。 下一次更改属性值时,OzCode将进入调试器并允许您检查程序的状态,并首先确定该问题值的确切位置! 这些Setter Breakpoints(属性断点)适用于常规属性和自动属性,甚至可以在没有源代码的属性上添加Setter Breakpoint!
Exceptions(异常)
Exceptions Trail(异常跟踪)
(点击此处了解更多详细信息)
如果没有OzCode,调查异常是一项沉闷的任务 —— 浏览内部异常的踪迹,滚动浏览冗长的callstack,并睁大眼睛观察异常的相关数据以尝试理解错误。 使用OzCode,可以方便的在工具窗口中显示有关异常的所有相关信息。 您可以使用超级方便的breadcrumb控制栏来浏览每个内部异常,甚至可以直接在Visual Studio中启动Google或stackoverflow搜索!
Predicting Exceptions(预测异常)
OzCode的预测会提醒您一个即将发生的异常。 但这并非全部 —— 例如,如果OzCode检测到即将发生的NullReferenceException,您将看到一个红色高亮显示将导致异常的确切表达式!
通过使用具有强大的编辑和继续功能,OzCode的预测异常分析使得在异常发生之前修复异常变得非常容易!
Trace(追踪)
(点击此处了解更多详细信息)
当您调试一个棘手的问题时,特别是在调试遗留代码或大量多线程场景时,单步执行代码来弄清楚系统正在做什么感觉就像试图同时处理12个球一样。 使用OzCode,当事情变得棘手时,您可以在程序执行期间在关键点轻松添加动态日志记录,然后使用OzCode投射到Visual Studio中的全功能集成日志查看器中查看输出。 您不再需要停止调试,添加日志记录代码,然后在每次添加简单跟踪时重建! 只需对要跟踪的值使用“Create Tracepoint(创建跟踪点)”命令即可。 Tracepoint就像一个断点,只是它不会破坏程序的执行,它会写一条跟踪消息。 然后,使用“Add To Tracepoint(添加到跟踪点)”按钮添加任何您认为可能与错误相关的信息:
最后,在Tracepoints视图中观察跟踪的消息:
Quick Attach(快速附加)
在许多项目中,无法通过只点击F5就启动调试会话。 相反,您必须使用“附加到进程”选项,在长长的进程列表中找到正确的进程,最后连接到它。 稍后,当您重新启动调试会话时,您必须重新执行此操作,一次又一次。 通过QuickAttach,OzCode可以实现超快速的附加到进程。 QuickAttach窗口显示最近附加的进程列表。 通过单击“固定”按钮,可以将快捷键附加到该进程:
就是这样。 从现在开始,每当我们想要附加到’w3wp.exe’时,我们只需点击“Shift+Alt+1”,如果您要附加的进程不在“最近附加”列表中,您可以随时搜索它,甚至可以预览UI的外观:
OzCode通过向您显示您正在附加的网站,使附加到IIS应用程序池非常容易:
Search(查找、搜索)
(点击此处了解更多详细信息)
调试对象和集合时,通常会查找特定属性或字段,或者属性或字段中保存的值。 不幸的是,这通常涉及大量点击和滚动,或编写自定义调试特定代码。 即使在简单的结构中查找项目也不容易,更不用说在复杂的对象图中这样做了。 通过我们的“Search”功能,情况不再如此。 无论对象的大小或对象图的复杂程度如何,都可以快速轻松的搜索成员名称和值!
Foresee(预知)
在调试会话期间单步执行foreach循环时,您可能会遇到一些常见问题,例如确定循环中的位置以及导航到集合中的特定条目。虽然Visual Studio确实提供了解决这些问题的方法,但它们并非易事。借助OzCode创新的“Foresee”功能,处理foreach循环非常简单直观。 Foresee是一个可视化调试工具,可帮助您随时跟踪循环中的位置,并允许导航到集合中的特定条目。它为您提供了集合的可视化表示,包括已经迭代的条目、当前条目和即将到来的条目。对集合中的特定条目感兴趣?只需右键单击该条目并选择“运行到此条目”,循环将执行,然后在运行到所需的条目时停止。无需设置和处理条件断点!由于Visual Studio的限制,Foresee功能目前仅在Visual Studio 2013中受支持。
Compare(比较)
(点击此处了解更多详细信息)
如果您想要比较文件,可以使用diff应用程序来发现差异。 不幸的是,当您需要比较两个(或更多)物体时,您必须相信您的眼睛和记忆。 使用我们的比较功能,您现在可以花更少的时间观察,并通过简单的点击让OzCode比较对象和集合! 结果将以并排视图显示,可帮助您调查两个对象之间的差异和相似之处。 一旦选择了一个对象进行比较,OzCode将突出显示与所选实例相当的所有其他局部变量和字段(意味着它们是相同的类型或派生自相同的类型)。
Compare items in a collection(比较集合中的项)
如果您需要比较同一个集合中两个或更多条目之间的差异怎么办? OzCode的Compare可以简单快速地比较多个条目。 比较同一个集合中的几个条目很容易,结果会并排显示。
Using external diff tool(使用外部diff工具)
比较两个长字符串 —— 例如两个XML或Json文档时,Compare会自动启动您最喜欢的Diff工具,这样可以非常容易地发现两者之间的差异。
您可以在“OzCode – Options”下配置“Compare”选项以使用Visual Studio的本机diff工具或外部diff工具。
目前支持的选项包括Beyond Compare(v3或v4),KDiff,WinMerge,Araxis Merge和Tortoise。
Compare snapshots(比较快照)
最难解决的问题是那些涉及神秘副作用的问题。 考虑一个漫长而复杂的方法,它接受一个对象并对其执行各种变化。 您能说出实际改变了什么吗? 对于一个有许多成员的类,其中也可能包含一些成员,找到差异是很困难的。 使用Compare,您现在可以保存对象的状态,然后在调试期间将对象与其原始保存状态进行比较。 执行该功能后,您可以选择比较快照选项以查看差异。
保存给定对象的快照时,将它在调试会话中持续保持不变! 您可以保存对象的快照,停止调试会话甚至关闭Visual Studio,然后在第二天重新打开并将实时对象与您保存的快照进行比较!
Reveal(显示、加星标)
(点击此处了解更多详细信息)
对象可以有许多属性,但在调试时,并非所有属性都对您有用。 您通常只对几个特定的属性感兴趣。 对于Customer类,它可能是ID和Username属性,对于3D空间中的Point类,它可能是X、Y和Z字段。 通过我们的“显示”功能,您最终可以专注于实际重要的数据。 为您感兴趣的属性添加星标,它们将出现在对象旁边。 例如,如果您有一组Customer对象,并且您主要关注它们的FirstName和Surname,只需对FirstName和Surname属性加注星标,集合中的所有对象将立刻在它们旁边显示这些属性。 您的选择将在调试会话和不同的Visual Studio解决方案文件中保留。
Custom Expressions(自定义表达式)
(点击此处了解更多详细信息)
调试时,有时您需要的信息不包含在对象的字段和属性中;相反,它是基于您的对象的计算或表达式。您可能会发现自己希望仅针对此特定调试会话拥有一组不同的属性。例如,当您在游戏中查看Player对象时,您可能希望看到距离最近的敌人的距离,而无需将此属性添加到其接口内。使用我们的自定义表达式功能,您可以在任何对象类型上创建多个自定义表达式,这些表达式将像该类型的任何其他成员一样显示。您甚至可以为您最感兴趣的加注星标。例如,如果Customer类在其属性中有工资历史记录,但是为了修复错误,您真正需要看到的是客户在某个特定年份的应缴费用,只需在Customer变量上选择“Add Custom Expression(添加自定义表达式)”即可,并写下您想要看到的表达式。表达式将显示为Customer类的属性,并包含表达式的值。
Filter Collections(过滤集合)
(点击此处了解更多详细信息)
在代码中对集合过滤相对容易,并且有很多方法可以做到这一点。 但是如何在调试时进行过滤呢? 例如,您有一组Customer对象,并且您希望过滤超过35岁的对象。 Visual Studio的即时窗口和监视窗口不支持lambdas。 使用我们的过滤集合功能,您可以将过滤表达式应用于任何集合。 要解决客户问题,请选择客户集合并将其过滤设置为:DateTime.Today.Year - [obj].Birthday.Year > 35,按Enter键并立即查看结果。 过滤集合后,过滤的结果也可以使用其他的所有功能。
Quick Actions(快速操作)
OzCode的快速操作为您提供最相关的操作,具体取决于您当前的上下文。 想要为类中的每个方法添加断点吗? 跟踪特定方法的每个条目? 快速前进到特定的代码行? 按“Alt + Shift + D”打开“快速操作”菜单或单击魔术棒,做一些魔法!
Show All Instances(显示所有实例)
(点击此处了解更多详细信息)
OzCode使得在内存中找到您想要探索的特定对象变得微不足道。 只需打开“Show All Instances of Type(显示所有的类型实例)”,您就可以看到当前在内存中的该类型的每个对象。 为什么那个对象仍在内存中? 是否有任何包含此值的对象? OzCode令人兴奋的新探索工具毫不费力的立即回答了这些问题以及更多问题。
Time Travel Debugging(时间旅行调试)
Predict the Future(预测未来)
在常规调试中,一旦断点命中,我们就能够看到程序的状态。 我们可以评估任何表达式,并在程序到达断点时获得它的值。OzCode中的Time Travel调试改变了游戏并允许您预测未来。
当在任何断点上时,OzCode将运行该方法的其余部分并评估所有代码行的后续行为。 您将能够通过头部显示(HUD)查看预测结果。
使用VIL进行的评估,这与Immediate window(立即窗口)和 Watch window(监视窗口)中使用的机制相同。
与Immediate window(立即窗口)不同,OzCode对未来的评估是在无副作用模式下的,因此程序状态不会改变。
到达当前方法的末尾或遇到 Native Code(本机代码)时,评估结束。 无法在无副作用模式下评估 Native Code(本机代码),因此预测会在那里结束。 预测范围用垂直紫色线表示:
预测是异步执行的,因此不会影响Visual Studio的性能。 它总是被执行,但为方便起见,预测的头部显示(HUD)最初会被关闭。 要查看预测HUD,只需单击“播放”按钮:
Time-Travel DataTip(时间旅行数据提示)
Visual Studio的常规DataTip(和Quick-Watch)将仅显示断点时的表达式的值。 在OzCode的预测模式中不是这样, DataTip将在评估代码行时就可以显示表达式的值:
Editing the Future(编辑未来)
您可以在断点处编辑代码,并且将来的预测会随着您的变化而变化:
这利用了Visual Studio的编辑和继续功能, 结果是您可以实时查看更改结果。
Time Travel Loops(时间旅行循环)
使用循环,显示未来并不简单,每次迭代都会有不同的值。
在进行时间旅行调试时,OzCode会在每个循环附近显示一个小装饰。 装饰显示迭代次数, 单击它将打开一个数据提示,显示每次迭代时迭代变量的值:
最初,OzCode始终显示最后一次迭代的数据状态。 您可以通过打开数据提示并单击任何迭代来在迭代之间切换。 选择后,HUD将在此期间显示选择的那个值。
请注意,迭代是基于1的索引。
Time Travel Conditionals(时间旅行条件句)
在循环中,if / else和switch语句通常对调试很有用。 OzCode直观地显示if语句返回的True和False,switch和case语句也是如此。
在每个这样的条件语句附近将会出现装饰,显示迭代符合条件的次数。 点击装饰将打开数据提示,允许导航到相关的迭代。