10个用于C#.NET开发的基本调试工具

在调试软件时,工具非常重要。获取正确的工具,然后再调试时提取正确的信息。根据获取的正确的错误信息,可以找到问题的根源所在。找到问题根源所在,你就能够解决该错误了。

你将看到我认为最基本的解决在C# .NET 中错误问题的工具的列表。这些将帮助你找到任何难题的根本原因并加以解决。

除了代码中的常见问题外,一下工具还可以处理各种问题类型,包括:

  • 性能问题

  • 内存问题(GC压力和内存泄漏)

  • 第三方引用库问题

  • 生产中的问题

  • 网络问题

1、Visual Studio

当涉及调试时,我们的主要工具就是Visual Studio。它是世界上最好的IDE之一,而不仅仅是在.NET 领域。它具有大量功能来帮助你进行调试,包括各种工具窗口,异常选项,工具提示等。根据2019年StackOverflow的调查,微软设法将基本功能和高级功能都整合到一个非常直观的程序中,是Visual Sudio成为所有开发人员第二受欢迎的IDE。

近年来,出现了两个竞争对手来挑战.NET IDE 领域:Rider和Visual Studio Code。根据我的经验,两者的调试功能仍然远远落后于Visual Studio。尽管Rider的重构功能和性能令人印象深刻。

除了交互式(传统)调试,VS还包括许多其他分析工具:

  • 性能分析

  • 内存分析

  • 使用IntelliTrace进行历史调试

  • 云调试(作为云探索的一部分)

对于上述所有类别,我更喜欢使用其他工具。继续进行阅读,它们都在本次清单中。

2、dnSpy

dnSpy 是用于 .NET 调试的最有用的工具之一。它是一个很好的反编译器。但是它的主要用途是作为调试器。dnSpy允许你调试任何 .NET程序你,而无需考虑符号或者源代码。

该工具的外观和感觉类似于Visual Studio。当你开始调试没有符号或者源代码的.NET进程时,dnSpy将向你显示反编译的代码。现在,这里有个魔术:你可以在反编译的代码本上中放置断点。遇到这些断点时,你将看到局部变量,线程,调用堆栈,并具有完整的调试经验。这使dnSpy成为调试第三方代码和调试生产环境的首选工具。

它轻巧,无需安装。只需将文件夹复制到任何生产机器上,然后开始调试。

这个工具有个小窍门。如果你使用dnSpy启动进程,那么一切将正常运行。但是,如果你附加到正在运行的进程时,则已加载的模块将保持优化状态。也就是说它们是在 Release模式下构建的。优化代码后,将不会遇到某些断点,也不会显示某些局部变量。这几乎破坏了调试体验。解决方案是使用dsSpy启动进程,而不是附加到进程中。

3、dotPeek

dotPeek是JetBrains的免费.NET反编译器。它们的许多工具实际上进入了该列表。与两个反编译器(如ILSpy或JustDecompile)相比,我更喜欢dotPeek,这有两个原因:

  1. dotPeek提供了更好的用户体验。或至少我感到自在。它看起来和感觉都像Resharper。所以这可能是原因。

  2. dotPeek可以从任何程序集中创建符号服务区,即使没有符号或源代码也是如此。它像dnSpy一样,它或反编译代码并从中创建符号。借助dotPeek,Visual Studio就像dnSpy一样调试任何第三方代码。要查看准确程度,请参阅我的文章:在Visual Studio中调试没有符号的第三方.NET代码,后续会进行翻译。

4、dotTrace

dotTrace是JetBrains的另一个出色工具。这是我最喜欢的性能分析工具。dotTrance允许你“记录”应用程序的运行,然后分析记录的性能。你将能够看到每种调用方法花费了多长时间,数据库调用,HTTP请求以及垃圾回收期间花费的时间等等。

上图显示了对Visual Studio的简短记录分析。你可以看到 ShowWindow花费了155毫秒,其中包括 HwndSourceHook(42ms), Convert(16ms)等方法用时。此方法的执行包括42%的WPF调用,20%的用户代码,12%的GC等待,10%的 Collections代码,10%的反射和5%的系统代码。太好了吧?

首先,这是一个学习曲线,但是一旦习惯了,它会变得非常直观。

5、SciTech's .NET Memory Profiler

内存分析器是解决内存问题必不可少的另一类工具。这些可能是由于GC(GC压力)引起的内存泄露或性能影响。如果你有足够大的应用程序,那么迟早会遇到内存问题。我希望为你以后着想,因为这些类型的问题可能是毁灭性的。

内存探查器可以拍摄“内存快照”,并让你对器进行调查。你将看到哪些对象占用最多的内存,谁引用了它们,以及为什么未进行垃圾回收。通过比较两个快照,可以发现内存泄露。

有几种可用的内存分析器,但是SciTech's .NET Memory Profiler是我的最爱。我发现它是功能最强大的产品,问题最少。

6、OzCode

OzCode是独特的Visual Studio扩展。其唯一目的是帮助你在Visual Studio中进行交互式调试。OzCode具有很多功能,可以分为4部分:

1. 上方显示 - OzCode在调试期间添加了一些有用的可视化功能。这包括红色/绿色突出显示并显示对象的选定属性:

还有其他内容,例如将表达式分解成各个部分:

2. LINQ调试 - LINQ在编写代码时很棒,但是很难调试。OzCode允许在调试过程中以几乎完美的方式研究LINQ表达式。

要了解有关使用或不使用OzCode调试LINQ的更多信息,请查看我的文章:如何在C#中调试LINQ查询。

3. 数据提示 - 数据提示是将鼠标悬停在Visual Studio中的变量上时看到的弹出窗口。OzCode用自己的更好的数据提示替换了该窗口。它允许“收藏夹”属性,搜索,导出为JSON和其他功能。

4. 时间穿梭 - OzCode 4 添加了新的革命性调试功能。它可以预测未来而无需移动断点。也就是说,你将能够看到当前调试位置之后发生的代码行中发生的情况。不过,此功能并非在所有情况下都有效。例如,OzCode无法预测HTTP请求结果或SQL请求之类的事情,因为它必须为此执行它们。

7、SysInternals Suite

SysInternals是一套用于对Windows软件进行故障排除和监视的实用程序。它包括一些我们调试所需的最重要的工具。我建议下载整个套件并将其保存在易于命令行键入的位置,例如:C:\Sysinternals。有很多工具,其中一些比其他工具更有用。让我们列出一些.NET最重要的。

Process Explorer

Process Explorer就像类固醇上的Windows Task Manager。它具有许多对调试有用的功能,这里是其中的一些:

  • 查看加载的模块

  • 查看句柄

  • 创建Dump

  • 查看进程树

  • 查看性能计数器

Process Monitor

Process Monitor 也称为ProcMon,允许你监视流程活动事件。具体的说,你可以看到注册表事件,文件事件,网络事件,线程活动和性能分析事件。如果你想找出你的过程涉及哪些文件或注册表,那么ProcMon可以为你提供帮助。

ProcDump

ProcDump是用于保存转储文件的命令行工具。它可以立即或在触发器上生成转储。例如,在崩溃或挂起时创建转储。这是我推荐的用于捕获转储的工具。以下是它的一些功能:

  • 立即创建转储

  • 创建具有特定间隔的多个转储(例如3个转储,相隔5秒)

  • 一旦超过CPU阈值,就创建转储

  • 如果进程挂起,则创建转储

  • 崩溃时创建转储

若要查找有关ProcDump和Dump的更多信息,请参阅我的文章:2019年如果创建、使用和调试.NET 应用程序崩溃转储 https://michaelscodingspot.com/how-to-create-use-and-debug-net-application-crash-dumps-in-2019/。

8、Performance Monitor (PerfMon)

Windows中有一种称为“性能计数器”的内置机制。这些计数器可让你根据计算机上发生的事情跟踪大量有用的指标。这些可能是系统范围内的指标,也可能是针对特定过程的指标。以下是一些可以使用性能计数器衡量的事情的示例:

  • CPU使用率

  • 内存使用率

  • 进程中引发的异常数

  • I/O字节的读写

  • 对你的asp.net应用程序的请求数

  • 在asp.net应用程序中请求响应时间

你可能会监视成千上万种不同的计数器,它们会尽可能的具体。例如,如果你想了解进程的内存使用情况,则有以下计数器:私有字节,虚拟字节,工作集,私有工作集,Gen X 集合,GC时间百分比,大对象堆大小 等等。

性能监视器是使你可以直观地看到这些计数器的工具(尽管也有其他工具)。它以在Windows设备预安装上了。要运行它,只需要在开始菜单中键入“Performance Monitor”,或在命令提示符下键入 perfmon

9、PerfView

PerfView是一个开源通用分析工具。它可以做很多事情,以下是其中一些:

  • 性能分析

  • 内存分析

  • 分析ETW事件

  • 从Linux导入性能快照

  • 有关应用程序行为的各种报告,包括JIT编译时间,垃圾回收时间等

它的分析是基于Windows事件跟踪(ETW)事件。这是一个内置的日志记录系统,运行速度非常快,Windows的每个部分都可以使用它。一切都将事件记录到ETW,包括内核,Windows操作系统,CLR运行时,IIS,ASP.NET框架,WPF等。

PerfView很容易成为此列表中最复杂的工具。但是它也非常强大。要开始使用PerfView,我建议在第九频道观看Vance Morrison的视频课程系统 https://channel9.msdn.com/Series/PerfView-Tutorial。

10、Fiddler

Fiddler是Progress Telerik的免费工具。这是我最喜欢的网络请求调试工具之一。它被称为HTTP代理服务器,仅此而已。它捕获所有HTTP请求,记录数据,并按其方式发送请求。

对于每一个请求,你都可以查看流程,Headers,payload,response,status等所有的内容。

对于调试,Fiddler具有两个有用功能:

  • 重新请求 - 你可以右键单击任何请求,然后单击“Replay”,这将再次发送完全相同的请求。在调试服务器端问题时非常有用。如果你要重现有问题的请求,Fiddler可以避免在客户端上重新运行方案以再次发送相同请求的麻烦。它还有助于处理难以重现的请求。

  • 编辑并重新请求 - 除了重新请求外,Fiddler允许我们修改请求。你可以更改标题,正文,甚至URL本身。你可以使用它来查看服务器端如何处理极端情况。或重现特定请求上发生的问题。

哪一个没有提到

你可能会想知道我未提及的某些工具,如果你已经做开发很长时间了,你可能会想到WinDbg。如果你不熟悉WinDbg,它是一个命令行调试器,曾经是Windows的主要调试工具。有点像现在的Visual Studio用于.NET。我觉得这在2020年以及以后并不重要。至少不适用于.NET开发。你可以使用Visual Studio进行几乎所有操作,并且它将变得越来越容易和快捷。

WinDbg的某些功能仍然是好的。像它的脚本功能一样,易于远程处理和方便的生产调试。你可以将WinDbg复制到生产计算机上,并快速调查转储文件。它不需要像Visual Studio这样的大型安装。但是我总是发现自己将转储文件复制到我的开发机器上,并使用内存分析器或者Visual Studio打开它们。这样更加有效。因此,我认为WinDbg不再是.NET开发所必需的调试工具。

总结

我们介绍了一些最佳的调试工具。我认为,了解这些工具对于成为高级开发人员至关重要。其中提到了一些可以用其类别中的类似工具代替。例如,你可以将dotMemory用作内存分析器,Visual Studio的内置分析器甚至PrefView。或者你可以使用RedGate的性能分析器来代替dotTrace。

无论你选择什么,都至少知道一个性能分析器可以帮助你解决本来会遇到的难题。内存分析器、生产调试工具(如dnSpy),反编译器以及其余的工具也是如此。

祝大家调试愉快!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311531.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python面向对象语言_Python语言基础之——面向对象编程

1.类属性1)类属性:直接定义在类中的变量是类属性类属性的值不会因为对象不同而不一样2)对象属性通过 self.属性名 值 定义在init函数中的属性对象属性的值会因为对象不同而不一样2.对象属性的增删改查1.查对象.属性 - 获取对象中指定属性对应的值,属性不存在会报错…

[蓝桥杯2015初赛]移动距离

题目描述 X星球居民小区的楼房全是一样的,并且按矩阵样式排列。 其楼房的编号为1,2,3… 当排满一行时,从下一行相邻的楼往反方向排号。 比如:当小区排号宽度为6时,开始情形如下: 1 2 3 4 5 6 12 11 10 9 8 7 13 14 15 …

数据结构-第九章 内部排序-知识点总结2

选择类排序: 1.简单选择排序: 直接从数组中选择最小的记录和第一个记录交换位置,循环. 示例代码如下: void SelectSort(int r[], int b){int i, j, k;int x;for(i 1; i < n; i){k i;for(j i1; j < n; j){if(r[j] < r[k])//选择最小的记录,得到在数组中的位置 k…

给微软的依赖注入框架写一些扩展方法

给微软的依赖注入框架写一些扩展方法Intro现在在项目里大多都是直接使用微软的依赖注入框架&#xff0c;而微软的注入方式比较简单&#xff0c;不如 AutoFac 使用起来灵活&#xff0c;于是想给微软的依赖注入增加一些扩展&#xff0c;使得可以像AutoFac 一样比较灵活的注册服务…

邻接表1试在邻接表存储结构上实现图的基本操作 insert_vertex 和 insert_arc,相关定义如下:icoding---算法改进--配详细注释

邻接表1 试在邻接表存储结构上实现图的基本操作 insert_vertex 和 insert_arc&#xff0c;相关定义如下&#xff1a; typedef int VertexType; typedef enum{DG, UDG }GraphType; typedef struct ArcNode{int adjvex;InfoPtr *info;struct ArcNode *nextarc; }ArcNode; typede…

最长公共子序列-dp

一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&#xff08;也可以不删除任何字符&#xff09;后组成的新字符串。 例如&#xff0c;“ace” 是 “abcde” 的子序列&#xff0c;但 “aec” 不是 “abcde” …

初中信息技术python教案_初中信息技术优质课教案 python程序设计开发第二课 第5课变量 教案...

环节教学过程知识点导学过程学习过程课前准备1.分成4组&#xff0c;选出组长&#xff0c;奖励规则&#xff1b;2.打开Python程序&#xff1b;3.快捷键的使用&#xff1a;CtrlN新建CtrlS保存CtrlC复制CtrlV粘贴F5运行熟悉快捷键创设情境观看动画&#xff1a;《鸡兔同笼》&#x…

哈希表添加哈希表(Hash Table,也叫散列表),是根据键(Key)而直接访问在内存存储位置的数据结构。typedef enum{ HASH_OK, -icoding

哈希表添加 哈希表&#xff08;Hash Table&#xff0c;也叫散列表&#xff09;&#xff0c;是根据键&#xff08;Key&#xff09;而直接访问在内存存储位置的数据结构。也就是说&#xff0c;它通过计算一个关于键值的函数&#xff0c;将所需查询的数据映射到表中一个位置来访问…

将 ASP.NET Core 2.1 升级到最新的长期支持版本ASP.NET Core 3.1

目录前言Microsoft.AspNetCore.Mvc.ViewFeatures.Internal 消失了升级到 ASP.NET Core 3.1项目文件&#xff08;.csproj&#xff09;Program.csStartup.csViewBag 与 Razor Pages 第一次接触ViewBag 与 Razor Pages 第二次接触小结&#xff08;文件更改对比图&#xff09;ASP.N…

[蓝桥杯2016初赛]密码脱落

题目描述 X星球的考古学家发现了一批古代留下来的密码。这些密码是由A、B、C、D 四种植物的种子串成的序列。 仔细分析发现&#xff0c;这些密码串当初应该是前后对称的&#xff08;也就是我们说的镜像串&#xff09;。 由于年代久远&#xff0c;其中许多种子脱落了&#xff0c…

python数据类型及使用方法_python 基本数据类型及方法

python的基本数据类型1.字符串str1.1作用不可变类型。主要是表示文本的数据类型&#xff0c;形容事物的属性。Python中最常用的类型之一。1.2方式主要有四种方式&#xff1a;文本内容。用单引号将内容包括。主要适用于单行。"文本内容"。用法同单引号。主要适用于单行…

AVL添加平衡二叉树,是一种二叉排序树,其中每个结点的左子树和右子树的高度差至多等于1。-icoding-数据结构-C-typedef struct node{ int val;

AVL添加 平衡二叉树&#xff0c;是一种二叉排序树&#xff0c;其中每个结点的左子树和右子树的高度差至多等于1。 它是一种高度平衡的二叉排序树。现二叉平衡树结点定义如下&#xff1a; typedef struct node {int val;struct node *left;struct node *right;struct node *par…

[蓝桥杯2015决赛]密文搜索

题目描述 福尔摩斯从X星收到一份资料&#xff0c;全部是小写字母组成。 他的助手提供了另一份资料&#xff1a;许多长度为8的密码列表。 福尔摩斯发现&#xff0c;这些密码是被打乱后隐藏在先前那份资料中的。 请你编写一个程序&#xff0c;从第一份资料中搜索可能隐藏密码的位…

WTM系列视频教程:View和Taghelper

文字摘要&#xff1a;“又到了老刘胡说的时间了&#xff0c;今天我们主要聊一下View和TagHelper。在前后端不分离的模式下&#xff0c;View还是很重的一块。”“前几课有朋友反馈说收获很大&#xff0c;也有朋友反应基础内容太多&#xff0c;众口难调啊。这个系列教程还是希望有…

sketch里的ios控件_30个让你眼前一亮的iOS Swift UI控件!

前言笔者接触 iOS 开发有一段时间了&#xff0c;尤其特别喜欢UI部分&#xff0c;特意收集整理了30个让你惊艳的第三方开源控件&#xff08;swift&#xff09;&#xff0c;无论是应用到项目中还是用来学习都能让你大呼过瘾&#xff0c;废话不多说&#xff0c;直接上图上链接&…

堆辅助函数二叉堆是完全二叉树或者是近似完全二叉树。二叉堆有两种:最大堆和最小堆。“最小堆”的定义如下:typedef struct _otherInfo-icoding-C

堆辅助函数 二叉堆是完全二叉树或者是近似完全二叉树。二叉堆有两种&#xff1a;最大堆和最小堆。 最大堆(大顶堆)&#xff1a;父结点的键值总是大于或等于任何一个子节点的键值&#xff0c;即最大的元素在顶端&#xff1b; 最小堆(小顶堆)&#xff1a;父结点的键值总是小于或…

【要闻】Kubernetes不适合发行版模式、Windows业务无法达到营收指引

评论&#xff1a;发行版模式适用于Linux但不适用于Kubernetes人们经常将Kubernetes比喻成一种革命&#xff0c;众多相关公司纷纷涌现以利用其发展趋势证明了这一点。在从前&#xff0c;希望在Linux领域中赚钱的公司拿走了核心&#xff0c;将其与最佳实践和喜爱的应用程序捆绑在…

[蓝桥杯2015决赛]积分之迷-枚举(水题)

题目描述 小明开了个网上商店&#xff0c;卖风铃。共有3个品牌&#xff1a;A&#xff0c;B&#xff0c;C。 为了促销&#xff0c;每件商品都会返固定的积分。 小明开业第一天收到了三笔订单&#xff1a; 第一笔&#xff1a;3个A 7个B 1个C&#xff0c;共返积分&#xff1a;31…

python车辆识别硬件_Opencv python之车辆识别项目

图片车辆识别根据文章搭建好环境后开始进行做项目linkimport sysimport cv2from PyQt5.QtGui import *from PyQt5.QtWidgets import *from PyQt5.QtGui import QIcon, QPalette, QPixmap, QBrush, QRegExpValidatorclass mainWin(QWidget):def __init__(self):""&quo…

[蓝桥杯2016决赛]反幻方-next_permutation枚举

题目描述 我国古籍很早就记载着 2 9 4 7 5 3 6 1 8 这是一个三阶幻方。每行每列以及对角线上的数字相加都相等。 下面考虑一个相反的问题。 可不可以用 1~9 的数字填入九宫格&#xff0c;使得&#xff1a;每行每列每个对角线上的数字和都互不相等呢&#xff1f; 这应该能做到。…