【问题标题】:Procdump -e creating dumps on non-fatal exceptionsProcdump -e 在非致命异常上创建转储
【发布时间】: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 只会在节目真正结束时才开始。

标签: c# .net seh procdump


【解决方案1】:

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

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

引用from here

把它放在一边,你就不会得到未处理异常的转储:

procdump processname.exe -ma

【讨论】:

  • 我确实想转储一个未处理的异常......问题是它以某种方式转储的未处理异常不是致命的(即不会导致崩溃),所以不是那些我感兴趣。
猜你喜欢
  • 1970-01-01
  • 2022-10-25
  • 2019-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多