我无法通过更改系统设置从我的进程中创建小型转储。所以我的问题是:
系统崩溃时是否会为用户进程创建一个小型转储
如果是,我需要配置哪个设置
还是我必须以编程方式创建小型转储。
调查崩溃时小型转储的效果如何
我正在使用 Windows XP、C++、VC6
您需要以编程方式创建一个小型转储(有一个例外,请参阅下一个链接)。CodeProject 有一篇关于 MiniDumps 的好文章。基本上,您想使用dbghelp.dll
, 并使用该功能MiniDumpWriteDump()
(请参阅MiniDumpWriteDump 上的 MSDN)。
这种转储的效果在很大程度上取决于应用程序。有时,对于优化的二进制文件,它们实际上是无用的。此外,如果没有经验,堆/堆栈损坏错误会导致您误入歧途。
但是,如果优化器对您来说不是太难,那么转储确实有帮助的一大类错误,即具有堆栈跟踪 + 本地使用变量的值的所有错误都是有用的,即许多纯虚拟-函数调用事物(即错误的销毁顺序)、访问冲突(未初始化的访问或缺少 NULL 检查)等。
顺便说一句,如果您的维护策略允许,请将您的应用程序从 VC6 移植到可接受的位置,例如 VC8 或 9。您会帮自己一个大忙。
我们在 Firefox 中使用Google Breakpad,尽管这至少需要 Visual C++ 2003。另一个好处是它还支持 OS X 和 Linux。
我最终在 Windows 上使用了 CrashRpt(需要我将整个代码库和工具链从 MinGW 移动到本机 Microsoft C/C++ 编译器),并在 Linux 上使用 google-breakpad。
如果您有几块钱可以节省 AQtrace可能值得一看。这具有在调试器内部发生崩溃的许多优点,同时在远程最终用户计算机上运行。
我意识到这是一个老问题,但就系统设置(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.