C# Sos.dll和windbg引发异常

C# Sos.dll和windbg引发异常,c#,.net,windbg,C#,.net,Windbg,我正在使用sos.dll和windbg分析w3wp.exe转储。perfmon中显示每秒抛出大量.Net CLR异常,我正在尝试对此进行调查。我试着做了一个测试!dumpheap-stat-type异常。但这是显示在我进行转储的实例中抛出的异常,还是显示创建的所有异常对象实例?可以在不引发的情况下创建异常对象实例 有没有办法只获取抛出的异常?您使用了错误的工具。安装Windows性能工具包,它是Windows 10 SDK的一部分。可用于Win8/10系统,也可用于Windows 7/2008R

我正在使用sos.dll和windbg分析w3wp.exe转储。perfmon中显示每秒抛出大量.Net CLR异常,我正在尝试对此进行调查。我试着做了一个测试!dumpheap-stat-type异常。但这是显示在我进行转储的实例中抛出的异常,还是显示创建的所有异常对象实例?可以在不引发的情况下创建异常对象实例


有没有办法只获取抛出的异常?

您使用了错误的工具。安装Windows性能工具包,它是Windows 10 SDK的一部分。可用于Win8/10系统,也可用于Windows 7/2008R2

现在,通过以管理员身份打开cmd.exe,使用捕获应用程序的活动

"C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit\wpr.exe" -start C:\DotNetRuntime.wprp
捕获工具的某些活动后,运行以下命令停止捕获:

"C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit\wpr.exe" -stop C:\Result.etl
现在双击
Result.etl
,在Windows Performance Analyzer和中打开它

现在将
一般事件
图形拖放到分析窗格中,为
提供者
过程
任务名
字段1
时间
操作码名
堆栈
。现在筛选Microsoft Windows DotNETRuntime提供程序,展开进程名称条目,然后展开Taskname
异常条目


在本演示中,VS加载项Resharper导致了一个
JetBrains.Application.Progress.ProcessCancelledException
。检查您在流程中看到的异常,并检查引发异常的堆栈。

引发的异常是第一次机会异常。由于您的程序没有崩溃,这意味着它们被捕获并处理

除了@magicandre1981,我还看到了两个其他选项:

程序转储 可以使用
-e1
命令行开关在第一次出现异常时创建崩溃转储。还定义
-n
以指定要进行的最大转储数。一旦您意识到异常并且不再希望报告它,请使用
-f
对其进行过滤

优点:您不仅拥有异常,还拥有一个调用堆栈和所有堆信息,可以在以后进行分析

缺点:这将大大降低您的进程,并占用大量磁盘空间

WinDbg异常命令 您可以将WinDbg附加到进程,并使用带有
-c
开关的
sxe
命令来分析首次机会异常。在命令中包含
g
,以继续执行。将所有输出写入日志文件(使用
.logopen
)很有帮助

例如:

.symfix
.reload
.logopen c:\debug\logs\firstchance.log
.loadby sos clr
ld * 
sxe -c "!pe;!clrstack;g" clr
g
.symfix
可能不需要重新加载。只要确定你的答案,否则所有的分析可能都是无用的。
ld*
只需预加载内容,以便以后更快地进行分析

优点:您可以捕获任意数量的信息,而无需创建巨大的崩溃转储


缺点:命令的执行可能会显著降低过程的速度。如果执行此操作时出现数百个异常,WinDbg可能会变得不稳定。(我很久没有这样做过,这个警告是根据我在2010年某个时候使用WinDbg 6.12的经验给出的)

它显示了所有创建的异常,因为它们已经是如此异常和OOM异常,即使它们还没有出现过。您是否尝试过使用ETW跟踪异常?