【问题标题】:What are .ni.dll and .ni.exe files in a minidump?minidump 中的 .ni.dll 和 .ni.exe 文件是什么?
【发布时间】:2013-03-31 10:53:04
【问题描述】:

由于我的应用程序崩溃,我从 Windows 应用商店应用程序提交过程(由审阅者发送)中获得了一个小型转储。我在为我的应用加载符号时遇到问题,因为错误发生在 App.ni.exe 内部,我不知道该文件来自哪里。

我的应用程序只有一个 App.exe(和一些 DLL),但转储一直引用 .ni.dll.ni.exe。在我的.appx.appxsym 文件中找不到这些文件。

我的应用是为每个特定平台(x86、x64 和 ARM)构建的。在 stackdump 中崩溃的是 x64 版本。

我目前对windbg的尝试:

符号路径:

Srv*C:\Users\Vegard\Appdata\local\temp\SymbolCache*http://msdl.microsoft.com/download/symbols`

Windbg 尝试:

0:006> !analyze -v
*******************************************************************************
*                                                                             *
*                        Exception Analysis                                   *
*                                                                             *
*******************************************************************************

Unable to load image Newtonsoft.Json.ni.dll, Win32 error 0n2
*** WARNING: Unable to verify checksum for Newtonsoft.Json.ni.dll
*** ERROR: Module load completed but symbols could not be loaded for Newtonsoft.Json.ni.dll
Unable to load image App.ni.exe, Win32 error 0n2
*** WARNING: Unable to verify checksum for App.ni.exe
*** ERROR: Module load completed but symbols could not be loaded for App.ni.exe
Unable to load image mscorlib.ni.dll, Win32 error 0n2
*** WARNING: Unable to verify checksum for mscorlib.ni.dll

更新:尝试 ngen App.exe(以管理员身份运行)我收到以下错误:

> ngen.exe install App.exe
[snip]
This operation is only valid in the context of an app container. 
(Exception from HRESULT: 0x8007109A)

在这种情况下,什么是应用容器?我应该从哪里运行它?

更新:经过长时间的故障排除,并通过其他方式找出根本原因,我得出结论,我得到的 minidump 文件缺少此信息。不管怎样哄都可以让调试器加载文件的符号。

【问题讨论】:

  • .ni 文件是 NGEN 文件。
  • @leppie:谢谢你,帮了我不少忙。我自己无法使用 ngen 生成这些文件。显然它“仅在应用容器的上下文中有效”。我该如何解决?
  • 如果这是一个托管应用程序,您甚至不需要使用!analyze -v。为什么不加载 sos 看看是什么异常导致它崩溃?
  • @Lex Li:我知道这是一个 StackOverflowException。但是,我无法弄清楚它起源于 my 代码的哪个位置,因为没有符号我无法获得完整的堆栈轨迹。
  • 对于基于 .NET 的应用程序,sos 提供了 !CLRStack。即使没有符号,您也可以获得线程的正确托管调用堆栈并轻松找到罪魁祸首。

标签: c# windows-store-apps windbg windows-store


【解决方案1】:

看一下工具说明Ngen.exe (Native Image Generator)

本机映像生成器 (Ngen.exe) 是一种提高托管应用程序性能的工具。 Ngen.exe 创建本机映像,这些文件包含已编译的特定于处理器的机器代码,并将它们安装到本地计算机上的本机映像缓存中。运行时可以使用缓存中的本机图像,而不是使用即时 (JIT) 编译器来编译原始程序集。

记住这个processor-specific machine code

如果您需要使用 NI 映像调试 minidump,您需要获取这些映像的符号 (PDB)。托管 DLL 的 PDB 将不起作用,您需要使用 NGEN 工具为 NGEN 映像生成本机 PDB,请查看文章 Creating NGEN PDBs for Profiling Reports。这篇文章是关于如何为 Profiler Report 获取 NGEN pdbs,但对于调试它是一样的。

正如我所说,请记住 NGEN 是 processor-specific machine code,因此要为它们生成 PDB:

由于 NGEN 映像是本机映像,因此请务必使用与您正在分析的应用程序架构 (x86/x64/ARM) 相匹配的 ngen.exe 副本。例如,如果应用程序在 Windows 8 RTM 上运行 64 位,那么您需要在“C:\Windows\Microsoft.NET\Framework64\v4.0.30319”中引用 ngen.exe 的副本

更新:

来自上面的link

如果您对 Windows 应用商店应用进行远程分析,则必须在分析时在运行该应用的计算机上执行此操作。如果您在正在查看报告的机器上执行此操作,它将不起作用

所以看起来您需要在获得 minidump 的同一台机器上生成 ngen 模块/pdb。

Windows 有一个Native Image Service,当您在计算机上安装一段时间后,它会为 Windows 应用商店应用程序生成 ni 映像。您可以尝试使用procmon.exe 来了解 Windows 如何为来自 Windows Store 的应用程序生成 ngen 模块。 (只需使用 ngen.exe 过滤进程名称)。

【讨论】:

  • 查看有问题的更新,了解当我尝试更新应用程序时会发生什么。
  • @VegardLarsen 看起来 NGEN 工具不允许您从 App Containers 为模块和 exe 文件生成 NGEN 映像,这可能是一种安全限制。我会尝试对此进行更多调查,如果我能找到什么,我会告诉你。
  • 顺便说一句,我的文章Creating NGEN PDBs for Profiling Reports的链接错误,现在已修复
  • @VegardLarsen 我用更多信息更新了我的答案。
【解决方案2】:

NI=原生图像。换句话说,上面的 cmets 表示的 NGEN 图像。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    • 2012-04-06
    相关资源
    最近更新 更多