2

一年多以前,我已经使用 WinDbg 和 DebugDiag 来查找我们在 Java 中使用的 JNI 本机 DLL 中的内存泄漏。现在我正在寻找线程句柄泄漏。我使用 Process Explorer 创建了一个内存转储,并尝试在 DebugDiag 中对其进行分析,但我得到的只是脚本错误: 内存转储分析因脚本错误而失败

我也尝试过 WinDbg,但它不再能够附加到进程。我总是收到错误消息“dbghelp.dll 的版本与调试器不匹配”:( WinDbg 6.12.0002.633 X86 失败 “Unbekannter Fehler”的意思是“未知错误”)

我卸载了 DebugDiag 和 Windows SDK,然后下载了最新版本并安装了 Windows SDK 8 和 DebugDiag 1.2 (x86)。问题保持不变。即使将 Windows SDK 替换为 7.1 版(Windows 7 的最新 SDK),也没有任何变化。

我正在使用一台装有 Windows 7(32 位)的机器。

我假设 DebugDiag 中的问题与 WinDbg 中的问题具有相同的原因。但我不明白版本不匹配是什么意思(谷歌搜索也没有帮助):

  • WinDbg:6.12.0002.633
  • 数据库:6.12.0002.633
  • 数据库帮助:6.12.0002.633

我怎样才能让 WinDbg(并希望 DebugDiag)再次工作?

4

1 回答 1

0

这是执行此检查的 dbgeng 部分的伪代码:

var (
    g_ApiVersion = API_VERSION{1, 0, 12, 0}
    g_DbghelpVersion API_VERSION
    g_EngOptions = Options{...}
)

func ChkDbghlpVersion() uint32 {
    g_DbghlpVersion = dbghelp.ImagehlpVersionEx(g_ApiVersion)
    if g_DbghelpVersion.Revision < g_ApiVersion.Revision {
        DebugOutput("dbghelp.dll has version mismatch with the debugger")
        if !(g_EngOptions.SomeOpt & 1) {
            return E_UNKNOWN
        }
    }
    return S_OK
}

因此,您应该检查dbghelp.dll调试文件夹中返回的ImagehlpApiVersionEx内容(可能还有dbgeng.dll其中的内容g_ApiVersion),以找出调试器失败的原因。

可能的原因:

  • dbghelp.dll 确实有一个备用的构建信息。
  • dbgeng.dll 已损坏 (?) 并在其 api 版本块中包含无效数据
于 2013-04-11T16:59:40.623 回答