procdump在未处理的异常时没有进行转储

19


我刚开始使用procdump,并且希望在未处理的二次机会异常发生时获得应用程序的完整转储。
根据文档,我这样运行它:


我刚刚开始使用procdump工具,并且希望在应用程序出现未处理的二次机会异常时获取完整的转储。根据文档说明,我需要按照以下方式运行该工具:

procdump.exe -ma -e -x C:\CrashDumps C:\Code\CrashApp\CrashApp\bin\Debug\CrashApp.exe

CrashApp.exe 是一个简单的控制台应用程序,启动时会抛出异常。
这是我得到的输出:

ProcDump v7.0 - Writes process dump files
Copyright (C) 2009-2014 Mark Russinovich
Sysinternals - www.sysinternals.com
With contributions from Andrew Richards

Process:               CrashApp.exe (6516)
CPU threshold:         n/a
Performance counter:   n/a
Commit threshold:      n/a
Threshold seconds:     10
Hung window check:     Disabled
Log debug strings:     Disabled
Exception monitor:     Unhandled
Exception filter:      *
Terminate monitor:     Disabled
Cloning type:          Disabled
Concurrent limit:      n/a
Avoid outage:          n/a
Number of dumps:       1
Dump folder:           C:\CrashDumps\
Dump filename/mask:    PROCESSNAME_YYMMDD_HHMMSS


Press Ctrl-C to end monitoring without terminating the process.

CLR Version: v4.0.30319

[23:54:51] Exception: E0434F4D.System.Exception ("Hello World")

Unhandled Exception: System.Exception: Hello World
   at CrashApp.Program.Crash(String message) in c:\Code\CrashApp\CrashApp\Program.cs:line 18
   at CrashApp.Program.Main(String[] args) in c:\Code\CrashApp\CrashApp\Program.cs:line 13
[23:54:52] The process has exited.
[23:54:52] Dump count not reached.

如您所见,他报告了一个未处理的异常,但未创建转储文件。
我在这里做错了什么?


就 procdump 而言,它并没有未处理的问题,您已获得了漂亮的托管堆栈跟踪。考虑使用 DebugDiag,它现在已经更新到版本 2.1 了。 - Hans Passant
@HansPassant,你确定那是正确的吗?使用procdump在第二次机会管理异常时我得到了一个完全合适的转储。 - Brian Rasmussen
@Brian - 我很确定,那个堆栈跟踪不是从天上掉下来的。我不确定是什么产生了它,据我所知,它是特定于控制台模式程序的。 - Hans Passant
1
@Hans Passant,我不明白你说我有一个堆栈跟踪的意义所在。这还不够,这就是为什么我想要一个转储来查看应用程序在崩溃点的状态的原因。procdump 明确表示发生了未处理的异常,并且“-e”开关表示:“当进程遇到未处理的异常时写入转储”。DebugDiag 看起来非常臃肿,我不想先创建疯狂的配置脚本,我只想在崩溃时获取我的 .Net 应用程序的转储,以便将其投入 Visual Studio 中查看发生了什么。 - NKnusperer
Procdump只有在观察到未处理的异常时才会开始工作。在您的程序中,它并没有未处理的异常。CLR介入了,捕获了未处理的托管异常,生成了诊断信息(异常消息和堆栈跟踪),然后终止了应用程序。在这个网站上抱怨Procdump或DebugDiag是没有用的,您需要向Microsoft支持团队寻求帮助。许多人已经使用Pinvoking MiniDumpWriteDump(),因此您根本不需要任何辅助工具,Google可以为您展示。 - Hans Passant
1
据我所见,-e -g 无法捕获 StackOverflowException 异常:[19:58:58] Exception: C00000FD.STACK_OVERFLOW [19:58:58] 进程已退出。 [19:58:58] 转储计数未达到。 - Kirill Osenkov
2个回答

21

由于存在.net标签,我怀疑您正在监视托管进程。如果是这样,请添加-g命令行选项,procdump将按您的预期工作。


3
太棒了!这是我的问题的正确答案(与上述情况类似)。只需要告诉Procdump以托管进程的本地调试器方式运行即可。 - craigrf
谢谢。这也帮助了我。从这个链接找到了这篇文章:http://forum.sysinternals.com/not-able-to-create-crash-dump-file-using-procdump_topic29849.html - Cloud
1
从我的测试来看,-e -g 似乎无法捕获堆栈溢出错误,例如:[19:58:58] 异常:C00000FD.STACK_OVERFLOW [19:58:58] 进程已退出。 [19:58:58] 转储计数未达到。 - Kirill Osenkov

8

尝试使用参数e 1 -f -g

-e 1会告诉procdump在第一次机会(已处理)异常以及未处理的异常上捕获转储文件,-f参数将允许您过滤您关心的异常类型。

例如:

procdump -ma -e 1 -f C00000FD.STACK_OVERFLOW -g -w CrashApp.exe


但如果我只想要未处理的异常呢?使用“-e -g”似乎无法捕获 StackOverflowException(除非加上“1”)。 - Kirill Osenkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接