2016-08-23 122 views
3

我一直认为自己在捕获转储方面经验丰富,但这个问题让我非常困惑。我有一个定期崩溃的.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的东西吗?

预先感谢任何建议

+1

Procdump不在检测例外是真的* *未处理的非常好。 CLR引入并将SEH异常转换为托管异常。然后被try/catch吞下,就会发生。不要考虑使用DebugDiag,它会更好。 –

+0

感谢汉斯,我怀疑可能是这种情况,过去我从来没有遇到过这种情况(过去我没有遇到过这个问题,但我已经获得了托管的.net流程的转储)。我认为使用WER Local Dumps也会导致同样的问题? –

+0

它不应该,只有当节目真的结束时,WER才会开始。 –

回答

0

你居然告诉ProcDump倾倒在未处理的异常你自己。

-e当进程遇到未处理的异常时写入转储。包含1以在第一次机会异常时创建转储。

报价采取from here

刚刚离开它,你会不会对未处理的异常得到转储:

procdump processname.exe -ma 
+0

我想转储一个未处理的异常......问题是它以某种方式转储的未处理的异常不是致命的(即不会导致崩溃),所以不是我感兴趣的异常。 –

相关问题