如何在. NET中启用程序集绑定故障日志记录(Fusion)

如何在. NET中启用程序集绑定故障日志记录(Fusion)?

531746 次浏览

设置以下注册表值:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion! EnableLog](DWORD)到1

要禁用,请设置为0或删除该值。

[编辑]:将以下文本保存到文件中,例如FusionEnableLog.regWindows注册表编辑器格式:

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion]"EnableLog"=dword:00000001

然后从windows资源管理器运行该文件并忽略有关可能损坏的警告。

将以下值添加到

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\FusionAdd:DWORD ForceLog set value to 1DWORD LogFailures set value to 1DWORD LogResourceBinds set value to 1DWORD EnableLog set value to 1String LogPath set value to folder for logs (e.g. C:\FusionLog\)

确保您在文件夹名称之后包括反斜杠并且文件夹已存在

您需要重新启动正在运行的程序以强制它读取这些注册表设置。

顺便说一句,不要忘记在不需要的时候关闭聚变测井。

在此处输入图片描述

如果您的机器上安装了Windows SDK,您将在Microsoft SDK\Tools下找到“Fusion Log Viewer”(只需在Vista或Windows 7/8的开始菜单中键入“Fusion”)。启动它,单击设置按钮,然后选择“日志绑定失败”或“记录所有绑定”。

如果禁用这些按钮,请返回开始菜单,右键单击日志查看器,然后选择“以管理员身份运行”。

我通常使用Fusion Log Viewer(Visual Studio命令提示符中的Fuslogvw.exe或开始菜单中的Fusion Log Viewer)-我的标准设置是:

  • 以管理员身份打开Fusion Log Viewer
  • 点击设置
  • 选中启用自定义日志路径复选框
  • 输入要写入日志的位置,例如c:\FusionLogs重要提示:确保您实际在文件系统中创建了此文件夹。)
  • 确保日志记录的正确级别已打开(我有时只是选择将所有绑定记录到磁盘以确保事情正常工作)
  • 点击好的
  • 将日志位置选项设置为自定义

记住,一旦你完成登录关闭!

(我刚刚发布了一个类似的问题-我认为这在这里也很重要。

融合日志设置查看器更改脚本是酒吧没有最好的方法来做到这一点。

ASP.NET中,有时很难让它正确工作。这个脚本很棒,也被列在Scott Hanselman的Power Tool列表上。我个人使用它很多年了,它从来没有让我失望过。

如果您已经启用了日志记录,并且在Windows 7 64位上仍然会出现此错误,请在IIS 7.5中尝试此操作:

  1. 创建新的应用程序池

  2. 转到此应用程序池的高级设置

  3. 启用32位应用程序设置为True

  4. 指向您的Web应用程序以使用此新池

只是一点点可能对其他人有帮助的信息;如果您按照在某个目录中搜索继承/实现类/接口的类的所有程序集的方式执行某些操作,那么如果您收到与您自己的程序集之一有关的此错误,请确保清除陈旧的程序集。

场景大概是这样的:

  1. 程序集A将所有程序集加载到某个文件夹中
  2. 此文件夹中的程序集B已过期,但引用了程序集C
  3. 程序集C存在,但命名空间、类名或其他一些细节可能在程序集B过时后的时间内发生了变化(在我的例子中,命名空间是通过重构过程更改的)

简而言之:A---load-->B(stale)---引用--->C

如果发生这种情况,唯一的标志是错误消息中的命名空间和类名。仔细检查它。如果您在解决方案中的任何地方都找不到它,您可能会尝试加载陈旧的程序集。

您还可以通过ETW/xperf激活Fusion日志,而不是使用丑陋的日志文件,方法是使用GUID763FD754-7086-4DFE-95EB-C01A46FAF4CAFusionKeyword关键字(0x4)打开DotnetRuntime私有提供程序(Microsoft-Windows-DotNETRuntimePrivate)。

@echo offecho Press a key when ready to start...pauseecho .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...pausepauseecho .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 -compressdel kernel.etldel clr.etldel clr_DCend.etl

当您现在打开完美视图中的ETL文件并查看Events表时,您可以找到Fusion数据:

Fusion事件

您可以以管理员身份运行此Powershell脚本以启用FL:

Set-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name ForceLog         -Value 1               -Type DWordSet-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name LogFailures      -Value 1               -Type DWordSet-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name LogResourceBinds -Value 1               -Type DWordSet-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name LogPath          -Value 'C:\FusionLog\' -Type Stringmkdir C:\FusionLog -Force

而这个要禁用:

Remove-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name ForceLogRemove-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name LogFailuresRemove-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name LogResourceBindsRemove-ItemProperty -Path HKLM:\Software\Microsoft\Fusion -Name LogPath

如果你想知道FusionLog.exe的位置-你知道你有它,但你找不到它?我在过去的几年里一遍又一遍地寻找FUSLOVW。移动到. NET 4.5版本的FUSION日志数量爆炸。她是可以在磁盘上找到的地方,具体取决于您安装的软件:

C:\Program Files(x86)\Microsoft SDK\Windows\v8.0A\bin\NETFX 4.0 Tools\x64

C:\Program Files(x86)\Microsoft SDK\Windows\v7.0A\bin\x64

C:\程序文件(x86)\Microsoft SDK\Windows\v8.1A\bin\NETFX 4.5.1工具\x64

C:\Program Files(x86)\Microsoft SDK\Windows\v8.0A\bin\NETFX 4.0工具

C:\Program Files(x86)\Microsoft SDK\Windows\v8.1A\bin\NETFX 4.5.1工具

C:\Program Files(x86)\Microsoft SDK\Windows\v7.0A\bin

在我的情况下帮助键入磁盘名称在小写

错误-C:\一些文件夹

正确-c:\一些文件夹

对于那些有点懒的人,我建议您在想要启用它时将其作为bat文件运行:

reg add "HKLM\Software\Microsoft\Fusion" /v EnableLog /t REG_DWORD /d 1 /freg add "HKLM\Software\Microsoft\Fusion" /v ForceLog /t REG_DWORD /d 1 /freg add "HKLM\Software\Microsoft\Fusion" /v LogFailures /t REG_DWORD /d 1 /freg add "HKLM\Software\Microsoft\Fusion" /v LogResourceBinds /t REG_DWORD /d 1 /freg add "HKLM\Software\Microsoft\Fusion" /v LogPath /t REG_SZ /d C:\FusionLog\
if not exist "C:\FusionLog\" mkdir C:\FusionLog

有太多的错误和程序集绑定日志查看器(FUSLOGVW.exe),我决定编写一个名为Fusion++并将其放在GitHub上.它内部使用相同的机制的替代查看器,但为您解析日志。您根本不必关心任何设置,甚至日志路径也不需要😉

您可以从这里或通过Chocolatey(choco install fusionplusplus)获得最新版本。

我希望你和这里的一些游客可以用它节省一些有价值的终身分钟。

Fusion++

这不是一个答案,而是一句警告:

  • 如果您启用此日志记录,别忘了禁用它,否则您以后会后悔的。

我确实忘记了,我最终在C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Windows\INetCache\IE文件夹中获得了几个GB的具有HTM扩展名的小日志文件-它显然记录了在NT AUTHORITY\SYSTEM帐户下运行的应用程序的所有程序集绑定。

文件数大于300万,并且总指挥官和Windows资源管理器都无法在不挂起的情况下显示内容或文件夹大小。

在禁用日志记录并重新启动以进行良好测量后,我从命令提示符中运行删除。

删除三星970 Pro SSD上的所有文件花了超过15分钟,该SSD一直显示100%的磁盘使用率-我的高端PC工作站被此删除操作降低到膝盖,并且在完成之前仅保持部分响应。