您可以使用许多工具来查看代码的底层,也可以查看内部CLR设备。 这篇文章是发一条推文发布的 ,我要感谢所有帮助列出合适工具的人。 如果我错过任何一个,请在评论中写下。
首先,我不得不提到Visual Studio和VSCode中 已经存在一个好的调试器 。 还有许多不错的(商业) .NET探查器和应用程序监视工具值得一看。 例如,我最近尝试使用Codetrack ,并对其功能印象深刻。
但是,剩余的帖子专门用于执行单个任务的工具 ,这将有助于更好地了解正在发生的事情。 所有工具都是开源的 。

PerfView是我使用多年的出色工具。 它基于Windows事件跟踪 (ETW)进行工作,使您可以更好地了解CLR内部正在发生的事情,还使您有机会了解内存和CPU使用情况。 要掌握该工具,您将不得不吸收大量信息,例如在培训视频的帮助下,但这值得您花费时间和精力。
该工具非常有用,Microsoft工程师自己可以使用它,并且在使用PerfView 分析瓶颈后,MSBuild上出现了许多最新的性能改进 。
该工具基于Microsoft.Diagnostics.Tracing.TraceEvent库 ,您可以使用该库创建自己的工具。 另外,由于该库的源代码是开放的,因此由于社区的原因,其中出现了许多有用的功能,例如flame-graphs :

SharpLab成为一种用于检查由Roslyn编译器生成的IL代码的工具,随着时间的推移,它演变为更多东西 :
SharpLab是用于运行.NET代码的交互式环境,它显示中间步骤和编译代码的结果。 该语言的某些功能只是其他功能的包装,例如,使用()变为try / catch。 使用SharpLab,您将看到编译器看到的代码,并更好地理解.NET语言的本质。
该工具支持C#,Visual Basic和F#,但其中最有趣的功能是反编译/反汇编:
反编译/反汇编功能可用于:
- C#
- 视觉基础
- 白介素
- JIT汇编代码(本机汇编代码)
您正确理解:该工具输出.NET JIT从C#代码生成的汇编代码:

使用此工具,您可以分析内存中.NET对象的结构,即 JITter如何安排属于您的类或结构的字段。 在编写高性能代码时,这很有用。 拥有可以为我们完成辛勤工作的工具也很好。
由于CLR作者保留将来更改此字段的权利,因此没有描述该字段结构的官方文档。 但是,如果您正在处理高速应用程序,则对结构的了解可能会很有用。
您如何研究结构? 您可以在Visual Studio中查看原始内存,也可以在SOS调试扩展中使用!dumpobj
。 两种方法都需要大量的精力,因此我们将创建一个在运行时显示对象结构的工具。
根据GitHub存储库中的示例,如果您使用具有类似代码的TypeLayout.Print<NotAlignedStruct>()
:
public struct NotAlignedStruct { public byte m_byte1; public int m_int; public byte m_byte2; public short m_short; }
将显示以下输出,该输出将准确显示CLR如何基于优化和填充规则将结构安排在内存中。
Size: 12. Paddings: 4 (%33 of empty space) |================================| | 0: Byte m_byte1 (1 byte) | |--------------------------------| | 1-3: padding (3 bytes) | |--------------------------------| | 4-7: Int32 m_int (4 bytes) | |--------------------------------| | 8: Byte m_byte2 (1 byte) | |--------------------------------| | 9: padding (1 byte) | |--------------------------------| | 10-11: Int16 m_short (2 bytes) | |================================|
如GitHub页面所述 ,TUNE是一种很有前途的工具。 它将帮助您了解.NET内部以及如何通过试验C#代码来提高性能。
有关他的详细信息,可以在这篇文章中找到,但在较高级别上,其功能如下 :
- 编写一个有效的C#代码示例,其中至少包含一个类,该类具有使用一个字符串参数的公共方法。 使用“运行”按钮启动代码。 您可以包括任何数量的方法和类。 但是请记住,将使用代码下输入窗口中的第一个参数来执行第一个公共类的第一个公共方法。
- 单击“运行”按钮以编译并执行代码。 另外,它将在相应的选项卡中编译为IL代码和汇编代码;
- 当Tune运行时(包括在运行时),该工具将构建一个显示垃圾收集器数据的图形。 它包含有关世代大小和垃圾回收会话的信息(以垂直线表示,下方带有一个数字,指示执行哪个世代垃圾收集)。
看起来像这样:

CLR内存诊断(ClrMD)工具
最后,让我们看一下特定类别的工具。 自.NET发布以来,开发人员一直能够使用WinDBG和SOS调试扩展来查看.NET运行时中发生的情况。 但是,这些并不是初次接触时最简单的工具,而且正如下一条推文所述,它们不一定总是最有效的:
幸运的是,Microsoft提供了ClrMD库(也称为Microsoft.Diagnostics.Runtime ),现在任何人都可以创建一个工具来分析.NET程序的内存转储。 详细信息可以在官方博客中找到。 我还建议看一下ClrMD.Extensions ,它“ ...提供与LINPad的集成,使使用ClrMD更容易 。 ”
我想列出所有现有工具的清单,并在Twitter上寻求帮助。 提醒自己:小心鸣叫。 负责WinDBG的经理可能会阅读它们并感到不高兴!
这些工具大多数都基于ClrMD进行工作,因为这是最简单的。 但是,如果您愿意,可以直接使用COM接口 。 还应该注意的是,任何基于ClrMD的工具都不是跨平台的 ,因为ClrMD本身仅是为Windows设计的。 在Linux上分析.NET Core核心转储中介绍了跨平台选项。
最后,为了保持平衡,最近出现了WinDBG的改进版本 ,他们立即尝试添加功能:
在所有这些单词之后,转到列表:
- 超级转储 ( GitHub )
- msos ( github )
- 具有命令行界面的环境,例如WinDbg,用于在没有SOS的情况下执行SOS命令。
- MemoScope.Net ( GitHub )
- .NET中用于分析过程内存的工具。 您可以将应用程序内存转储到文件中,然后再读取。
- 该文件包含所有数据(对象)和有关线程的信息(状态,堆栈,调用堆栈)。 MemoScope.Net将分析数据并帮助您查找内存泄漏和死锁。
- dnSpy ( github )
- .NET程序集调试器和编辑器
- 即使您没有源代码,它也可以用于编辑和调试程序集。
- MemAnalyzer ( GitHub )
- 用于托管代码的内存分析工具。 有一个命令行界面。
- 像Windbg中的
!DumpHeap
可以确定哪些对象占用了堆上的最大空间,而无需安装调试器。
- DumpMiner ( GitHub上 )
- 跟踪CLI ( GitHub )
- 棚 ( GitHub )
- Shed是一个应用程序,用于分析.NET中程序的执行情况。 它可用于分析恶意软件,以获取有关在启动此类软件时存储哪些信息的数据。 棚可以:
- 检索存储在托管堆中的所有对象
- 显示存储在存储器中的行;
- 以JSON格式创建堆快照以进行进一步处理;
- 转储所有加载到内存中的模块。
您可以找到许多其他使用ClrMD的工具。 使它可用是Microsoft的一个好主意。
其他工具
其他值得一提的工具:
