当我的进程崩溃时,如何创建minidump?

33

我无法通过更改系统设置来创建我的进程的小型转储文件。因此,我的问题是:

  • 当用户进程崩溃时,系统是否会创建一个小型转储文件?

    如果是,我需要配置哪些设置?

  • 还是说我必须在程序中动态地创建小型转储文件?

  • 研究崩溃时,小型转储文件有多有效?

我正在使用Windows XP,C ++,VC6。


你可以随时结合try-catch和fstream来创建自己的迷你转储。 - user5058091
6个回答

31

你需要通过编程创建迷你转储文件(有一个例外,请参见下一个链接)。CodeProject上有一篇关于MiniDumps的好文章。基本上,你需要使用dbghelp.dll,并使用函数MiniDumpWriteDump()(请参阅MSDN关于MiniDumpWriteDump)。

这些转储文件有多有效取决于应用程序。有时,对于优化二进制文件,它们几乎是没有用的。此外,如果没有经验,堆栈损坏错误将使你误入歧途。

但是,如果优化器对你不是太苛刻,那么有一个大类错误在其中转储文件是有帮助的,即所有需要有堆栈跟踪+本地变量值的错误,例如许多纯虚函数调用的问题(即错误的销毁顺序),访问冲突(未初始化的访问或缺少NULL检查)等。

顺便说一句,如果您的维护策略允许,将应用程序从VC6移植到像VC8或9这样可接受的东西会使自己受益匪浅。


1
快进到2022年。使用Visual Studio进行调试构建。你已经认真研究和使用了SEH和MiniDumpWriteDump。如果创建了一个minidump,请使用Visual Studio 2022打开它。你的新生活开始了 :) - Chef Gladiator

16

我在 debugInfo.com 上发现了一篇很棒的文章。这值得一读:

有效的minidumps目前已经过时,所以请看 Wayback Machine 上的存档版本


6
我知道这是一个老问题,但在系统设置方面(OP的第一点),您可以启用设置以使用Windows错误报告的内置自动崩溃转储生成。这在此处有记录:https://learn.microsoft.com/en-us/windows/win32/wer/collecting-user-mode-dumps。由于需要提升权限,因此最好在手动设置(如果您是管理员)或应用程序安装时进行设置。如果您的应用程序否则不需要提升权限,则不建议在运行时设置它。
基本上,您需要在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\<app_name.exe>下创建一个新键,并在那里自定义选项。好处在于崩溃转储会自动生成,您可以控制它们存储的位置、类型和包含哪些信息,以及保留多少个转储。 这可能是在Windows上生成和管理用户模式崩溃转储最简单的方法。

5
我们在Firefox中使用Google Breakpad,但这需要至少Visual C++ 2003。好的副作用是它也支持OS X和Linux。

2

我最终在Windows上使用了CrashRpt(这要求我将整个代码库和工具链从MinGW迁移到本机的Microsoft C/C++编译器),在Linux上使用了google-breakpad。


1
如果你能花费一些钱,AQtrace 可以值得一看。这在远程用户机器上运行时,具有使用调试器内发生崩溃的许多优点。

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