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

2024-01-10

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

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

我的应用程序是为每个特定平台(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

Update:尝试 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)

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

Update:经过长时间的故障排除,并通过其他方式找出根本原因,我得出的结论是我得到的小型转储文件缺少此信息。无论如何哄骗都可以让调试器加载文件的符号。


看一下工具说明Ngen.exe(本机图像生成器) https://learn.microsoft.com/en-us/dotnet/framework/tools/ngen-exe-native-image-generator:

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

请记住这一点processor-specific machine code.

如果您需要使用 NI 映像调试小型转储,您需要获取这些映像的符号 (PDB)。托管 DLL 的 PDB 将不起作用,您需要使用 NGEN 工具为 NGEN 图像生成本机 PDB,请查看文章为分析报告创建 NGEN PDB https://devblogs.microsoft.com/devops/creating-ngen-pdbs-for-profiling-reports/。本文介绍如何为 Profiler Report 获取 NGEN pdb,但对于调试来说是相同的。

正如我所说,请记住 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 副本

UPDATE:

来自link https://devblogs.microsoft.com/devops/creating-ngen-pdbs-for-profiling-reports/ above:

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

所以看起来您需要在获得小型转储的同一台计算机上生成 ngen 模块/pdb。

Windows 有一个原生镜像服务 https://learn.microsoft.com/en-us/previous-versions/dotnet/netframework-4.0/ms165074(v=vs.100),当您在计算机上安装 Windows 应用商店应用程序一段时间后,它会生成 ni 映像。您可以尝试使用进程监控程序 https://learn.microsoft.com/en-gb/sysinternals/downloads/procmon了解 Windows 如何为 Windows 应用商店中的应用程序生成 ngen 模块。 (只需使用 ngen.exe 过滤进程名称)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

小型转储中的 .ni.dll 和 .ni.exe 文件是什么? 的相关文章

随机推荐