我一直认为自己在捕获转储方面经验丰富,但这个问题让我非常困惑。我有一个定期崩溃的.net进程......我不知道它在崩溃,它是在本机或托管代码中崩溃,还是它是处理异常或第三方DLL的进程本身。我所知道的是它正在崩溃。我试图使用procdump得到崩溃的转储,但我真的很挣扎。我设置procdump如下:Procdump -e在非致命异常情况下创建转储
procdump processname.exe -ma -e
的问题是,这样做的几分钟之内,procdump将生成转储和退出...即使该过程从未真正坠毁。如果我添加-g,我仍然得到相同的结果......几分钟后,procdump将生成一个转储并退出。如果我再次启动它,同样的事情会发生。我打开了它生成的一些转储,并且它们没有任何本机异常上下文。所以,我甩了所有的管理调用堆栈对任何托管线程,(在所有的转储我到目前为止已经检查),我发现类似这样的调用堆栈的东西:
System.Threading.WaitHandle.WaitAny
System.Runtime.IOThreadTimer+TimerManager.OnWaitCallback
System.Runtime.IOThreadScheduler+ScheduledOverlapped.IOCallback
System.Runtime.Fx+IOCompletionThunk.UnhandledExceptionFrame
System.Threading._IOCompletionCallback.PerformIOCompletionCallback
我想这未处理的异常是什么导致procdump生成转储文件。我做了一些搜索并找到了UnhandledExceptionEventHandler对象。所以我想这个过程必须有一些内容来捕捉未处理的异常。或者这只是标准的SEH东西?
无论哪种方式,我不关心这些未处理的异常,我只关心导致崩溃的异常。有什么方法可以告诉procdump只在致命异常时创建转储?我不认为-t会工作,因为这不会捕获异常,只会在进程正常结束时转储。我唯一的选择是转移到其他类似DebugDiag的东西吗?
预先感谢任何建议
Procdump不在检测例外是真的* *未处理的非常好。 CLR引入并将SEH异常转换为托管异常。然后被try/catch吞下,就会发生。不要考虑使用DebugDiag,它会更好。 –
感谢汉斯,我怀疑可能是这种情况,过去我从来没有遇到过这种情况(过去我没有遇到过这个问题,但我已经获得了托管的.net流程的转储)。我认为使用WER Local Dumps也会导致同样的问题? –
它不应该,只有当节目真的结束时,WER才会开始。 –