9

经过大量搜索,我仍然无法找到问题的解决方案。

我有一个 mdmp 文件。调用堆栈显示它正在使用 mscorlib.ni.dll。所以要获取函数信息,我需要获取它的 pdb 文件。

mscorlib.ni.dll 的版本是 2.0.50727.3655。我相信它来自.Net Framework 3.5。

由于 mscorlib.ni.dll 是 ngen.exe 生成的原生优化 dll,所以我需要使用 ngen.exe createpdb 为这个 dll 生成 pdf。

ngen.exe createpdb "C:\Windows\assembly\...\mscorlib.ni.dll" "C:\SymbolCache"

结果如下:

  1. 我在文件夹“C:\Windows\Microsoft.NET\Framework64\v3.5”中找不到 ngen.exe
  2. 我可以在文件夹“C:\Windows\Microsoft.NET\Framework64\v2”中找到 ngen.exe,但它没有 createpdb 选项。
  3. 我可以在文件夹“C:\Windows\Microsoft.NET\Framework64\v4.0.30319”中找到 ngen.exe,它确实支持 createpdb 选项,但它会报告错误。

Microsoft (R) CLR Native Image Generator - 版本 4.0.30319.18408 版权所有 (c) Microsoft Corporation。版权所有。在本机映像“C:\Windows\assembly\NativeImages_v2.0.507 7_64\mscorlib\5cd1c2848ff40eb0a8c149706ee394fa\mscorlib.ni.dll”中发现无效标头。未指定的错误(来自 HRESULT 的异常:0x80004005 (E_FAIL))

所以我不知道如何获取 Net Framework 3.5 的这个 mscorlib.ni.dll 的 pdb。

任何想法?

4

2 回答 2

9

在我意识到我从 Framework 64文件夹中调用 ngen.exe 之前,我收到了同样的错误消息。显然,mscorlib.ni.dll 不是 64 位的。

所以我从文件夹中使用了 32 位版本的 ngen.exe C:\Windows\Microsoft.NET\Framework\v4.0.30319,它成功地生成了 PDB。

但是,您的 mscorlib.ni.dll 的路径包括...\NativeImages_v2.0.507 7_64\...,这表明它是 64 位的,因此这可能是一个不同的问题。

于 2015-06-29T17:22:39.827 回答
1

就像 Monsignor 的回答一样,对我来说,解决方案是匹配位数(64 位或 32 位)。我的 minidump 是 64 位的,所以我必须转到 Framework64 文件夹并从那里运行 ngen,这很好。我最初遇到与此处描述的相同的 ngen 错误(在本机图像中找到无效的标头...E_FAIL),因为我在 Framework 文件夹而不是 Framework64 文件夹(facepalm)中。

但是,即使 ngen 命令有效......在我的场景中,最终生成的 pdb 仍然不被 VS 2013 接受为匹配的符号文件。

于 2016-01-01T05:24:47.803 回答