C# 小型转储中的.ni.dll和.ni.exe文件是什么?

C# 小型转储中的.ni.dll和.ni.exe文件是什么?,c#,windows-store-apps,windbg,windows-store,C#,Windows Store Apps,Windbg,Windows Store,由于我的应用程序崩溃,我从Windows应用商店应用程序提交过程(由审阅者发送)中获得了一个小型转储。我加载应用程序的符号时遇到问题,因为错误发生在app.ni.exe文件中,我不知道该文件来自何处 我的应用程序只有一个app.exe(和一些dll),但转储文件一直引用.ni.dll和.ni.exe。在我的.appx或.appxsym文件中找不到这些文件 我的应用程序是为每个特定平台(x86、x64和ARM)构建的。是x64版本在stackdump中崩溃 我当前使用windbg的尝试: 符号路径

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

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

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

我当前使用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)
在这种情况下,什么是应用程序容器?我应该在哪里运行它


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

NI=Native Image。换言之,如上面的注释所示,已生成图像。

请查看工具说明:

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

请记住这是处理器特定的机器代码

如果需要使用NI映像调试minidump,则需要获取这些映像的符号(PDB)。托管DLL的PDB将无法工作,您需要使用NGEN工具为NGEN的映像生成本机PDB,请参阅本文。本文介绍如何获取NGENPDBsforProfiler报告,但对于调试也是一样的

正如我所说的,请记住NGEN是一种特定于处理器的机器代码,因此要为它们生成PDB:

由于NGEN的映像是本机映像,因此使用与正在评测的应用程序(x86/x64/ARM)的体系结构匹配的NGEN.exe副本非常重要。例如,如果应用程序在Windows 8 RTM上运行64位,则需要在“C:\Windows\Microsoft.NET\Framework64\v4.0.30319”中引用ngen.exe的副本

更新:

从上面:

如果您远程评测了Windows应用商店应用程序,则必须在评测时运行应用程序的计算机上执行此操作。如果在正在查看报告的机器上执行此操作,则此操作将不起作用

因此,看起来您需要在获得小型转储的同一台机器上生成ngen模块/PDB


Windows具有,当您在计算机上安装Windows应用商店应用程序一段时间后,它会为Windows应用商店应用程序生成ni映像。您可以尝试使用查找Windows如何从Windows应用商店为应用程序生成ngen模块。(只需将筛选器用于进程名和ngen.exe)

.ni文件是加密文件。@leppie:谢谢你,帮了我不少忙。我无法使用ngen自己生成这些文件。显然,它“仅在应用程序容器的上下文中有效”。我该怎么处理呢?你甚至不需要使用
!如果这是托管应用程序,请分析-v
。为什么不加载sos,看看是什么异常导致它崩溃?@Lex Li:我知道这是StackOverflowException。然而,我无法找出这在我的代码中的起源,因为我无法获得没有符号的完整堆栈轨迹。对于基于.NET的应用程序,sos提供了!CLRStack。即使没有符号,您也可以获得线程的正确托管调用堆栈并轻松找到罪犯。有关我尝试对应用程序进行ngen时发生的情况,请参阅相关更新。@Vegardarsen看起来ngen工具不允许您从应用程序容器中为模块和exe文件生成ngen映像,这可能是一个安全限制。我将尝试调查更多关于这一点,让你们知道我是否会找到什么。顺便说一句,我有错误的文章链接,现在它是fixed@VegardLarsen我用更多的信息更新了我的答案。