为什么我的 CLR 分析器不加载普通的、非配置文件优化的本机图像?
Why do plain, non-profile-optimized native images aren't loaded by my CLR profiler?
我正在开发一个 CLR 分析器,使用 CLR profiling interfaces,并且很难让 CLR 加载普通的、非配置文件优化的本机图像(使用 ngen.exe
编译的没有 /profile
选项)当 运行 我的探查器时(或者至少,似乎没有加载这些图像,但现在我不能确定)。我做错了什么?
我已确认 COR_PRF_USE_PROFILE_IMAGES
标志(只允许配置文件优化的原生图像)未在我的分析器中设置。
以下是我试过的方法。非常感谢任何 help/tips!
FUSLOGVW 输出:
我一直在检查原生图像活页夹日志(在 FUSLOGVW.exe
中)试图弄清楚图像是否已加载:
当 运行 HelloWorld.exe
使用 "plain" 本机图像时 - 这是 NGEN'd 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'd with 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\HelloWorld47de1868c93e9132a1952a34e0a785\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 Broman 的 blog post 中有描述)。这可能有助于故障排除。
回来回答我自己的问题,看来确实加载了原生图像! (两种 - 普通和配置文件优化)。问题是我的理解确实是这样。
我的错误来源是误读了 FUSLOGVW 日志输出。具体来说,不知何故,我没有看到 /profile
图像给出了 WRN: Native image compile options do not match request. Looking for next native image
,但图像搜索继续并找到了普通的非个人资料图像,并且成功了。
最终帮助我理解的是Visual Studio。在 Visual Studio 中调试 CLR 探查器时,本机图像的绑定显示在 调试输出 window 中,其中还显示了正在加载的 DLL:
'CSharpTestProgram.exe' (Win32): Loaded 'C:\Windows\assembly\NativeImages_v4.0.30319_64\mscorlibef49acbb43c068f6ddf1587283b5f29\mscorlib.ni.dll'.
一旦我得到这个,FUSLOGVW 日志开始变得更有意义,我可以准确了解加载了哪个图像以及何时加载。
另一个观察结果是 mscorlib /profile
图像比普通原生图像占用更多磁盘 space(在我的例子中大 30%),这也帮助我关联了图像路径和不管是/profile
还是不是
我正在开发一个 CLR 分析器,使用 CLR profiling interfaces,并且很难让 CLR 加载普通的、非配置文件优化的本机图像(使用 ngen.exe
编译的没有 /profile
选项)当 运行 我的探查器时(或者至少,似乎没有加载这些图像,但现在我不能确定)。我做错了什么?
我已确认 COR_PRF_USE_PROFILE_IMAGES
标志(只允许配置文件优化的原生图像)未在我的分析器中设置。
以下是我试过的方法。非常感谢任何 help/tips!
FUSLOGVW 输出:
我一直在检查原生图像活页夹日志(在 FUSLOGVW.exe
中)试图弄清楚图像是否已加载:
当 运行
HelloWorld.exe
使用 "plain" 本机图像时 - 这是 NGEN'dngen.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'd with
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\HelloWorld47de1868c93e9132a1952a34e0a785\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 Broman 的 blog post 中有描述)。这可能有助于故障排除。
回来回答我自己的问题,看来确实加载了原生图像! (两种 - 普通和配置文件优化)。问题是我的理解确实是这样。
我的错误来源是误读了 FUSLOGVW 日志输出。具体来说,不知何故,我没有看到 /profile
图像给出了 WRN: Native image compile options do not match request. Looking for next native image
,但图像搜索继续并找到了普通的非个人资料图像,并且成功了。
最终帮助我理解的是Visual Studio。在 Visual Studio 中调试 CLR 探查器时,本机图像的绑定显示在 调试输出 window 中,其中还显示了正在加载的 DLL:
'CSharpTestProgram.exe' (Win32): Loaded 'C:\Windows\assembly\NativeImages_v4.0.30319_64\mscorlibef49acbb43c068f6ddf1587283b5f29\mscorlib.ni.dll'.
一旦我得到这个,FUSLOGVW 日志开始变得更有意义,我可以准确了解加载了哪个图像以及何时加载。
另一个观察结果是 mscorlib /profile
图像比普通原生图像占用更多磁盘 space(在我的例子中大 30%),这也帮助我关联了图像路径和不管是/profile
还是不是