Sos.dll和windbg获取异常抛出

时间:2017-01-04 08:25:33

标签: c# .net windbg

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

有没有办法获得抛出的异常?

2 个答案:

答案 0 :(得分:1)

您使用了错误的工具。安装Windows Performance Toolkit,它是Windows 10 SDK的一部分。 The 1607 SDK可用于Win8 / 10系统,the older 1511 SDK可用于Windows 7 / 2008R2。

现在使用WPRP profile that I posted here通过以管理员身份打开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性能分析器和load debug symbols中打开它。

现在拖累&将Generic Event图表拖放到分析窗格,订购ProviderprocessTasknameField 1Time,{{1}的列}和Opcode Name。现在过滤Stack提供程序并展开您的进程名称条目,然后展开任务名Microsoft-Windows-DotNETRuntime的条目:

enter image description here

在此演示中,VS Addon Resharper导致Exception。检查您为进程看到的错误,并检查堆栈引发异常的位置。

答案 1 :(得分:1)

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

除了@ magicandre1981' approach之外,我还看到了另外两个选项:

ProcDump

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

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

缺点:这会显着降低您的流程并占用大量磁盘空间。

WinDbg异常命令

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

是有帮助的

示例:

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

.symfix.reload。只需确保您的symbols are correct,否则所有分析都可能毫无用处。 ld *只会预先加载内容,以便以后加快分析速度。

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

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