[英]How to enable assembly bind failure logging (Fusion) in .NET
如何在 .NET 中启用程序集绑定失败日志记录 (Fusion)?
将以下值添加到
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion Add: DWORD ForceLog set value to 1 DWORD LogFailures set value to 1 DWORD LogResourceBinds set value to 1 DWORD EnableLog set value to 1 String LogPath set value to folder for logs (e.g. C:\FusionLog\)
确保在文件夹名称后包含反斜杠并且文件夹存在。
您需要重新启动正在运行的程序以强制它读取这些注册表设置。
顺便说一句,不要忘记在不需要时关闭融合日志记录。
我通常使用 Fusion Log Viewer(来自Visual Studio 命令提示符的Fuslogvw.exe或来自开始菜单的 Fusion Log Viewer) - 我的标准设置是:
c:\\FusionLogs
(重要提示:确保您已在文件系统中实际创建了此文件夹。)完成后记得关闭注销!
(我刚刚在一个类似的问题上发布了这个 - 我认为它在这里也很相关。)
如果您的机器上安装了 Windows SDK,您将在 Microsoft SDK\\Tools 下找到“Fusion Log Viewer”(只需在 Vista 或 Windows 7/8 的开始菜单中键入“Fusion”)。 启动它,单击“设置”按钮,然后选择“记录绑定失败”或“记录所有绑定”。
如果这些按钮被禁用,请返回开始菜单,右键单击日志查看器,然后选择“以管理员身份运行”。
您可以以管理员身份运行此 Powershell 脚本以启用 FL:
Set-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name ForceLog -Value 1 -Type DWord
Set-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name LogFailures -Value 1 -Type DWord
Set-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name LogResourceBinds -Value 1 -Type DWord
Set-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name LogPath -Value 'C:\FusionLog\' -Type String
mkdir C:\FusionLog -Force
而这个要禁用:
Remove-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name ForceLog
Remove-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name LogFailures
Remove-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name LogResourceBinds
Remove-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name LogPath
设置以下注册表值:
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Fusion!EnableLog] (DWORD) 到 1
要禁用,请设置为 0 或删除该值。
[编辑]:以 Windows 注册表编辑器格式将以下文本保存到文件中,例如 FusionEnableLog.reg:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion]
"EnableLog"=dword:00000001
然后从 Windows 资源管理器运行该文件并忽略有关可能损坏的警告。
程序集绑定日志查看器 (FUSLOGVW.exe)有很多错误,我决定编写一个名为Fusion++的替代查看器并将其放在 GitHub 上。 它在内部使用相同的机制,但会为您解析日志。 你根本不需要关心任何设置,甚至不需要记录路径 😉
您可以从这里或通过 Chocolatey( choco install fusionplusplus
)获得最新版本。
我希望你和这里的一些游客可以用它来节省一些有价值的终生时间。
Fusion 日志设置查看器更改器脚本绝对是执行此操作的最佳方法。
在ASP.NET 中,有时很难让它正常工作。 该脚本运行良好,也列在Scott Hanselman 的 Power Tool 列表中。 我个人使用它多年,它从未让我失望。
除了使用丑陋的日志文件,您还可以通过ETW/xperf激活 Fusion 日志,方法是打开具有 GUID 763FD754-7086-4DFE-95EB-C01A46FAF4CA
和FusionKeyword
关键字 (0x4) 的 DotnetRuntime Private 提供程序 ( Microsoft-Windows-DotNETRuntimePrivate
)在。
@echo off
echo Press a key when ready to start...
pause
echo .
echo ...Capturing...
echo .
"C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\xperf.exe" -on PROC_THREAD+LOADER+PROFILE -stackwalk Profile -buffersize 1024 -MaxFile 2048 -FileMode Circular -f Kernel.etl
"C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\xperf.exe" -start ClrSession -on Microsoft-Windows-DotNETRuntime:0x8118:0x5:'stack'+763FD754-7086-4DFE-95EB-C01A46FAF4CA:0x4:0x5 -f clr.etl -buffersize 1024
echo Press a key when you want to stop...
pause
pause
echo .
echo ...Stopping...
echo .
"C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\xperf.exe" -start ClrRundownSession -on Microsoft-Windows-DotNETRuntime:0x8118:0x5:'stack'+Microsoft-Windows-DotNETRuntimeRundown:0x118:0x5:'stack' -f clr_DCend.etl -buffersize 1024
timeout /t 15
set XPERF_CreateNGenPdbs=1
"C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\xperf.exe" -stop ClrSession ClrRundownSession
"C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\xperf.exe" -stop
"C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\xperf.exe" -merge kernel.etl clr.etl clr_DCend.etl Result.etl -compress
del kernel.etl
del clr.etl
del clr_DCend.etl
当您现在在PerfView 中打开 ETL 文件并查看 Events 表下时,您可以找到 Fusion 数据:
对于那些有点懒惰的人,我建议将其作为 bat 文件运行,以便在您想要启用它时使用:
reg add "HKLM\Software\Microsoft\Fusion" /v EnableLog /t REG_DWORD /d 1 /f
reg add "HKLM\Software\Microsoft\Fusion" /v ForceLog /t REG_DWORD /d 1 /f
reg add "HKLM\Software\Microsoft\Fusion" /v LogFailures /t REG_DWORD /d 1 /f
reg add "HKLM\Software\Microsoft\Fusion" /v LogResourceBinds /t REG_DWORD /d 1 /f
reg add "HKLM\Software\Microsoft\Fusion" /v LogPath /t REG_SZ /d C:\FusionLog\
if not exist "C:\FusionLog\" mkdir C:\FusionLog
只是一点点信息,可能对其他人有帮助; 如果您在某个目录中搜索所有程序集以查找继承/实现类/接口的类,那么如果遇到与您自己的程序集之一有关的错误,请确保清除过时的程序集。
该场景将类似于:
简而言之:A ---loads--> B (stale) ---references ---> C
如果发生这种情况,唯一的标志是错误消息中的命名空间和类名。 仔细检查一下。 如果您在解决方案中的任何地方都找不到它,您可能正在尝试加载一个陈旧的程序集。
如果您已启用日志记录,但在 64 位 Windows 7 上仍然出现此错误,请在 IIS 7.5 中尝试此操作:
创建新的应用程序池
转到此应用程序池的高级设置
将启用 32 位应用程序设置为True
指向您的 Web 应用程序以使用此新池
以防万一您想知道 FusionLog.exe 的位置 - 您知道您拥有它,但找不到它? 在过去的几年里,我一遍又一遍地寻找 FUSLOVW。 迁移到 .NET 4.5 后,FUSION LOG 的版本数量激增。 根据您安装的软件,可以在磁盘上找到它的位置:
C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v8.0A\\bin\\NETFX 4.0 Tools\\x64
C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v7.0A\\Bin\\x64
C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v8.1A\\bin\\NETFX 4.5.1 Tools\\x64
C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v8.0A\\bin\\NETFX 4.0 工具
C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v8.1A\\bin\\NETFX 4.5.1 工具
C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v7.0A\\Bin
在我的情况下,帮助输入小写的磁盘名称
错误- C:\\someFolder
正确- c:\\someFolder
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.