Sos.dll和windbg抛出exception

我正在使用sos.dll和windbg来分析w3wp.exe转储。 在perfmon中显示了大量的每秒每秒抛出的.Net CLRexception,我正试图对此进行调查。 我试过做一个!dumpheap -stat -type Exception。 但这是否显示了我在转储的实例中抛出的exception,或者这是否显示了所有创建的exception对象实例? 可以在不抛出的情况下创建exception对象实例。

有没有办法获得抛出的exception?

你使用错误的工具。 安装Windows性能工具包,它是Windows 10 SDK的一部分。 1607 SDK可用于Win8 / 10系统, 较旧的1511 SDK可用于Windows 7 / 2008R2。

现在使用我在此处发布的WPRP配置文件,通过以管理员身份打开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性能分析器中打开它并加载调试符号 。

现在将Generic Event图拖放到分析窗格,为Providerprocess ,任务Opcode NameField 1TimeOpcode NameStack订购列。 现在筛选Microsoft-Windows-DotNETRuntime提供程序并展开进程名称条目,然后展开Taskname Exception的条目:

在此处输入图像描述

在这个演示中,VS Addon Resharper导致JetBrains.Application.Progress.ProcessCancelledException 。 检查您为进程看到的错误,并检查堆栈引发exception的位置。

抛出的exception是第一次机会exception。 由于您的程序没有崩溃,这意味着它们被捕获和处理。

除了@ magicandre1981的方法 ,我还看到了另外两个选项:

ProcDump

ProcDump可以使用-e 1命令行开关在第一次机会exception时创建故障转储。 还要定义-n以指定要采用的最大转储数。 一旦您意识到exception并且不再希望报告exception,请使用-f进行过滤。

优点:您不仅有例外,还有一个调用堆栈以及稍后可以分析的所有堆信息。

缺点:这将显着减慢您的进程并占用大量磁盘空间。

WinDbgexception命令

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

例:

 .symfix .reload .logopen c:\debug\logs\firstchance.log .loadby sos clr ld * sxe -c "!pe;!clrstack;g" clr g 

.symfix.reload可能没有必要。 只要确保你的符号是正确的 ,否则所有的分析可能都是无用的。 ld *将预先加载东西,以便以后更快地进行分析。

优点:您可以根据需要捕获尽可能多的信息,而不会产生巨大的崩溃转储。

缺点:执行命令可能会显着减慢进程。 当您使用数百个例外时,WinDbg可能会变得不稳定。 (我从来没有这么做过很长一段时间,这个警告是根据我在2010年的WinDbg 6.12经验给出的)