WinDbg:尝试连接到进程时dbghelp.dll的版本不匹配

时间:2013-04-08 15:17:26

标签: windows debugging windbg debugdiag

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

我也尝试过WinDbg,但它无法再附加到进程了。我总是收到错误消息“dbghelp.dll与调试器的版本不匹配”: WinDbg 6.12.0002.633 X86 fails with "Could not attach to process xxx 0x80004005" (“Unbekannter Fehler”表示“未知错误”)

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

我正在使用Windows 7(32位)的计算机。

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

  • WinDbg:6.12.0002.633
  • dbgeng:6.12.0002.633
  • dbghelp:6.12.0002.633

如何让WinDbg(希望DebugDiag)再次运行?

1 个答案:

答案 0 :(得分: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.dllImagehlpApiVersionEx返回的内容(以及可能dbgeng.dll中的g_ApiVersion),以找出调试器的原因失败。

可能的原因:

  • dbghelp.dll确实有备用构建信息。
  • dbgeng.dll已损坏(?)并且在其api版本块中包含无效数据