我正在使用CLR profiling interfaces开发CLR探查器,并且很难让CLR加载普通的,非配置文件优化的本机映像(使用ngen.exe
编译运行我的探查器时没有/profile
选项)(或者至少,似乎没有加载这样的图像,但是现在我无法确定)。我做错了什么?
我已经确认我的探查器中未设置COR_PRF_USE_PROFILE_IMAGES
标志(仅允许配置文件优化的原生图像)。
以下是我尝试过的内容。非常感谢任何帮助/提示!
FUSLOGVW输出:
我一直在检查原始图片活页夹日志(FUSLOGVW.exe
),试图弄清楚图片是否已加载:
使用" plain"运行HelloWorld.exe
时原生图像 - 这是NGEN' ngen.exe install HelloWorld.exe
启用了探查器 - 装配活页夹日志(ExplicitBind!FileName=(HelloWorld.exe).HTM
)显示:
Assembly manager loaded from: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Running under executable d:\work\dotnet\projects\HelloWorld\HelloWorld\bin\x64\Debug\HelloWorld.exe
--- A detailed error log follows.
WRN: Native image compile options do not match request. Looking for next native image.
因此,基于该警告,似乎未加载原生图像。
使用个人资料图片运行时,NGEN' ngen.exe install HelloWorld.exe /Profile
,图像似乎已成功加载,装配活页夹输出为:
LOG: Start validating all the dependencies.
LOG: [Level 1]Start validating native image dependency mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089.
Native image has correct version information.
LOG: Validation of dependencies succeeded.
LOG: Bind to native image succeeded.
Attempting to use native image C:\WINDOWS\assembly\NativeImages_v4.0.30319_64\HelloWorld\5647de1868c93e9132a1952a34e0a785\HelloWorld.ni.exe.
Native image successfully used.
所以看来这次,图片已经加载了。
为了确保在每个ngen步骤之间,我删除c:\Windows\assembly\NativeImages_v4.0.30319_32\mscorlib
所有图片,以便就使用的设置达成一致(HelloWorld.exe
没有其他依赖关系。)
其他信息:
COR_PRF_DISABLE_ALL_NGEN_IMAGES
,这会完全禁用本机图像(David {@ 3}}中描述的这一点来自David Broman)。这可能有助于排除故障。答案 0 :(得分:0)
回过头来回答我自己的问题,似乎本机图像确实已经加载了! (两种 - 平原和轮廓优化)。我的理解是问题确实如此。
我的消费来源是误读了FUSLOGVW日志输出。具体来说,不知怎的,我错过了WRN: Native image compile options do not match request. Looking for next native image
图像的/profile
,但图片搜索仍在继续,找到了普通的非剖面图像,并成功了。
最终让我理解的是Visual Studio。在Visual Studio中调试CLR探查器时,本机映像的绑定显示在 Debug Output 窗口中,其中还显示了正在加载的DLL:
'CSharpTestProgram.exe' (Win32): Loaded 'C:\Windows\assembly\NativeImages_v4.0.30319_64\mscorlib\2ef49acbb43c068f6ddf1587283b5f29\mscorlib.ni.dll'.
一旦我得到这个,FUSLOGVW日志开始变得更有意义,我可以准确理解加载的图像和时间。
另一个观察结果是mscorlib /profile
图像占用的磁盘空间比普通原生图像多(在我的情况下大30%),这也帮助我关联图像路径和是否{{1}或不。