为什么我的CLR分析器没有加载普通的,非配置文件优化的原生图像?

时间:2017-07-23 16:09:19

标签: .net .net-4.0 clr ngen clr-profiling-api

我正在使用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没有其他依赖关系。)

其他信息:

  • 我使用的是.NET 4.0,因此我无法访问COR_PRF_DISABLE_ALL_NGEN_IMAGES,这会完全禁用本机图像(David {@ 3}}中描述的这一点来自David Broman)。这可能有助于排除故障。

1 个答案:

答案 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'. 

Visual Studio - Output - Native Image

一旦我得到这个,FUSLOGVW日志开始变得更有意义,我可以准确理解加载的图像和时间。

另一个观察结果是mscorlib /profile图像占用的磁盘空间比普通原生图像多(在我的情况下大30%),这也帮助我关联图像路径和是否{{1}或不。