返回

Windows 7 上 MiniDumpWriteDump 错误疑难解答:如何解决?

windows

## 在 Windows 7 上疑难解答 MiniDumpWriteDump 错误

问题概要

在 Windows 7 上使用 MiniDumpWriteDump 函数收集正在运行进程的转储时,你可能会遇到错误。函数调用返回 0,并且没有任何有意义的错误代码。

根本原因

对于 Windows 7 及更早版本,MiniDumpWriteDump 函数需要将 exceptionInfo.ClientPointers 设置为 TRUE。但是,此设置对于 Windows 8 及更高版本不再有效。这会导致 Windows 7 上的函数返回 0。

解决方案

解决此问题的关键是根据 Windows 版本调整 exceptionInfo.ClientPointers 设置:

  • Windows 7 及更早版本:
exceptionInfo.ClientPointers = TRUE;
  • Windows 8 及更高版本:
exceptionInfo.ClientPointers = FALSE;

在运行 MiniDumpWriteDump 函数之前,确保已正确设置 exceptionInfo.ClientPointers。

其他注意事项

除了调整 ClientPointers 设置外,还需要注意以下事项:

  • 确保正在使用的进程句柄具有 PROCESS_VM_READ 和 PROCESS_QUERY_INFORMATION 访问权限。
  • 验证转储文件路径具有所需的写入权限。
  • 如果错误仍然存在,请使用 GetLastError() 函数获取扩展错误信息。

代码示例

以下代码示例展示了如何根据 Windows 版本设置 exceptionInfo.ClientPointers:

MINIDUMP_EXCEPTION_INFORMATION exceptionInfo = { 0 };

// 根据 Windows 版本设置 exceptionInfo.ClientPointers
if (IsWindows8OrGreater())
{
    exceptionInfo.ClientPointers = FALSE;
}
else
{
    exceptionInfo.ClientPointers = TRUE;
}

// ... 其他代码 ...

auto res =
    ::MiniDumpWriteDump(hProcess, process.ProcessID(), hDumpFile,
        (MINIDUMP_TYPE)(MiniDumpNormal | MiniDumpWithIndirectlyReferencedMemory |
            MiniDumpWithDataSegs | MiniDumpWithFullMemory),
        &exceptionInfo, nullptr, nullptr);

总结

通过正确设置 exceptionInfo.ClientPointers 并注意其他注意事项,你可以在 Windows 7 上成功使用 MiniDumpWriteDump 函数收集进程转储。

常见问题解答

1. 我仍然收到错误代码,该怎么办?

使用 GetLastError() 函数获取扩展错误信息,该信息将提供有关错误的更多详细信息。

2. 为什么在 Windows 8 及更高版本中 ClientPointers 设置无效?

在 Windows 8 及更高版本中,MiniDumpWriteDump 函数的内部实现发生了变化,使得 ClientPointers 设置不再有效。

3. 如何确保拥有必要的进程访问权限?

可以使用 OpenProcess 函数获取对进程的句柄,并使用 PROCESS_VM_READ 和 PROCESS_QUERY_INFORMATION 标志进行访问。

4. 为什么需要设置 dump 文件的写入权限?

MiniDumpWriteDump 函数需要将转储数据写入文件,因此必须确保目标文件路径具有适当的写入权限。

5. MiniDumpWriteDump 函数有哪些其他高级选项?

MiniDumpWriteDump 函数提供了许多其他选项来控制转储的类型和内容。有关详细信息,请参阅 Microsoft 文档。