我正在使用sos.dll和windbg来分析w3wp.exe转储。在perfmon中显示了大量的每秒每秒抛出的.Net CLR异常,我正在尝试对此进行调查。我试过做一个!dumpheap -stat -type Exception。但这是否显示了我在转储的实例上抛出的异常,或者这是否显示了所有创建的异常对象实例?可以在不抛出的情况下创建异常对象实例。
有没有办法获得抛出的异常?
答案 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
图表拖放到分析窗格,订购Provider
,process
,Taskname
,Field 1
,Time
,{{1}的列}和Opcode Name
。现在过滤Stack
提供程序并展开您的进程名称条目,然后展开任务名Microsoft-Windows-DotNETRuntime
的条目:
在此演示中,VS Addon Resharper导致Exception
。检查您为进程看到的错误,并检查堆栈引发异常的位置。
答案 1 :(得分:1)
抛出的异常是第一次机会异常。由于您的程序没有崩溃,这意味着它们被捕获和处理。
除了@ magicandre1981' approach之外,我还看到了另外两个选项:
ProcDump可以使用-e 1
命令行开关在第一次机会异常时创建故障转储。还要定义-n
以指定要采用的最大转储数。一旦您发现异常并且不再希望报告异常,请使用-f
对其进行过滤。
优点:您不仅有例外,还有一个调用堆栈和所有可以在以后分析的堆信息。
缺点:这会显着降低您的流程并占用大量磁盘空间。
您可以将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经验给出了这个警告)