30

我无法通过更改系统设置从我的进程中创建小型转储。所以我的问题是:

  • 系统崩溃时是否会为用户进程创建一个小型转储

    如果是,我需要配置哪个设置

  • 还是我必须以编程方式创建小型转储。

  • 调查崩溃时小型转储的效果如何

我正在使用 Windows XP、C++、VC6

4

6 回答 6

29

您需要以编程方式创建一个小型转储(有一个例外,请参阅下一个链接)。CodeProject 有一篇关于 MiniDumps 的好文章。基本上,您想使用dbghelp.dll, 并使用该功能MiniDumpWriteDump()(请参阅MiniDumpWriteDump 上的 MSDN)。

这种转储的效果在很大程度上取决于应用程序。有时,对于优化的二进制文件,它们实际上是无用的。此外,如果没有经验,堆/堆栈损坏错误会导致您误入歧途。

但是,如果优化器对您来说不是太难,那么转储确实有帮助的一大类错误,即具有堆栈跟踪 + 本地使用变量的值的所有错误都是有用的,即许多纯虚拟-函数调用事物(即错误的销毁顺序)、访问冲突(未初始化的访问或缺少 NULL 检查)等。

顺便说一句,如果您的维护策略允许,请将您的应用程序从 VC6 移植到可接受的位置,例如 VC8 或 9。您会帮自己一个大忙。

于 2009-10-10T06:57:26.260 回答
15

感谢大家查看和回复,特别感谢 gimpf,我在互联网和 msdn 上搜索了一下。

我在debugInfo.com上找到了一篇很棒的文章,值得一读:

有效的小型转储

于 2009-10-10T08:01:17.573 回答
4

我们在 Firefox 中使用Google Breakpad,尽管这至少需要 Visual C++ 2003。另一个好处是它还支持 OS X 和 Linux。

于 2010-03-24T17:53:25.517 回答
2

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

于 2012-12-21T12:50:29.490 回答
1

如果您有几块钱可以节省 AQtrace可能值得一看。这具有在调试器内部发生崩溃的许多优点,同时在远程最终用户计算机上运行。

于 2009-10-10T07:52:11.110 回答
1

我意识到这是一个老问题,但就系统设置(OP 的第一个点)而言,您可以启用设置以使用 Windows 错误报告的内置自动崩溃转储生成。这记录在这里:https ://docs.microsoft.com/en-us/windows/win32/wer/collecting-user-mode-dumps 。由于这需要提升,因此最好手动设置(如果您是管理员)或在应用程序的安装时设置。如果您的应用程序不需要提升,我不建议在运行时设置它。

本质上,您创建一个新密钥HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\<app_name.exe>并在那里自定义选项。这样做的好处是崩溃转储是自动生成的,您可以控制它们的存储位置、类型和包含的信息,以及保留多少转储。

This is probably the easiest method of generating and managing user mode crash dumps on Windows.

于 2021-10-12T01:02:41.840 回答