C# Sos.dll和windbg引发异常
我正在使用sos.dll和windbg分析w3wp.exe转储。perfmon中显示每秒抛出大量.Net CLR异常,我正在尝试对此进行调查。我试着做了一个测试!dumpheap-stat-type异常。但这是显示在我进行转储的实例中抛出的异常,还是显示创建的所有异常对象实例?可以在不引发的情况下创建异常对象实例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
有没有办法只获取抛出的异常?您使用了错误的工具。安装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跟踪异常?