4

我一直认为自己在捕获转储方面经验丰富,但这让我很困惑。我有一个 .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 之类的其他东西吗?

提前感谢您的任何建议

4

1 回答 1

0

您实际上告诉 ProcDump 自己转储未处理的异常。

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

引用自这里

只需将其排除在外,您就不会在未处理的异常上得到转储:

procdump processname.exe -ma
于 2016-08-23T08:57:24.153 回答