【发布时间】:2016-08-23 08:50:20
【问题描述】:
我一直认为自己在捕获转储方面经验丰富,但这一点确实让我感到困惑。我有一个 .net 进程定期崩溃......我不知道它崩溃的原因是什么,它是在本机代码还是托管代码中崩溃,甚至是进程本身遇到异常还是第 3 方 DLL。我只知道它正在崩溃。我正在尝试使用 procdump 转储崩溃,但我真的很挣扎。我设置procdump如下:
procdump 进程名.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 本地转储也会导致同样的问题,对吧?
-
不应该,WER 只会在节目真正结束时才开始。