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

How to enable assembly bind failure logging (Fusion) in .NET

提问人:user32736 提问时间:11/1/2008 最后编辑:Peter Mortensenuser32736 更新时间:10/16/2022 访问量:563195

问:

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

C# .NET vb.net 绑定 程序集

评论

52赞 6/13/2011
如果有人关心,要使用融合记录器(fuslogvw.exe),请阅读这篇文章:msdn.microsoft.com/en-us/library/e74a18c4(v=VS.100).aspx它会告诉你在哪里下载它和其他信息。
15赞 SliverNinja - MSFT 2/28/2012
@Will - 感谢分享!作为奖励 - 确保您以管理员身份运行以避免任何权限问题。fuslogvw.exe
4赞 tehDorf 4/6/2016
作为相关说明,请务必在完成后关闭融合记录器(fuslogvw.exe)。我的“C:\Windows\...\Temporary Internet Files\”文件夹中有 400 万条日志。所有文件的总大小为 6 GiB,但由于它们远小于群集大小,因此实际使用的磁盘空间为 16 GiB。
16赞 Coxy 4/18/2016
@Will 我不同意安装 fuslogvw 是“最佳”答案。如果你能只获得该工具,而不必在可能不是开发环境的地方安装整个 Windows SDK,那么你就有道理了。
2赞 Coxy 4/19/2016
@Will 当然,但您链接到的答案并不涵盖任何内容。

答:

94赞 user32736 11/1/2008 #1

设置以下注册表值:

[HKEY_LOCAL_MACHINE\软件\Microsoft\Fusion!EnableLog] (DWORD) 设置为 1

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

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

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion]
"EnableLog"=dword:00000001

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

评论

4赞 Jon Skeet 11/1/2008
并不是说该条目可能不存在 - 您必须创建它。至少,当我在今天早上坠机前准备回答这个问题时,我做到了:)
4赞 Bruno Martinez 7/14/2009
什么 !意味 着?键还是值?64 位系统呢?
2赞 Marchy 11/17/2009
这实际上不起作用。该值是 ForceLog 而不是 EnableLog,这里需要一个额外的步骤(请参阅:thepursuitofalife.com/...)
49赞 Nick DeMayo 6/22/2010
实际上,这确实有效......只需运行 IISRESET Afterwords 即可使其正常工作。
4赞 Brian 2/9/2011
@Norman:因为此特定设置用于使 Asp.Net 错误在错误页中显示程序集绑定错误消息,而不是将日志保存到文件中。@OP: +1.经过编辑以包含 .reg 文件。这!格式是我从未见过的,除了将我发送到此页面寻找答案的错误消息中。
987赞 Gary Kindel 10/7/2009 #2

将以下值添加到

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\)

请确保在文件夹名称后包含反斜杠,并且文件夹存在

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

顺便说一句,不要忘记在不需要时关闭融合日志记录。

enter image description here

评论

5赞 Gary Kindel 12/7/2010
一些人报告说,注册表更改不会立即进行。您是否尝试过打开Fusion日志记录然后重新启动?
60赞 Orion Edwards 3/29/2011
您需要重新启动正在运行的任何程序,以便它读取这些注册表设置
27赞 Michhes 7/30/2010
Gary 的解决方案对我有用,尽管我还必须重置 IIS。注意:我在不想安装 SDK 等的干净环境中配置了它。
60赞 r3mark 6/4/2013
Fusion Log Viewer 可为您完成所有这些工作。转到“开始”->“程序”-> Visual Studio xxxx > Visual Studio Tools > Visual Studio 命令提示符(以管理员身份运行),然后键入“fuslogvw”。在“设置”中,您可以调整日志记录。
14赞 Igor Kustov 11/19/2013
为了方便地打开/关闭日志记录,我创建了 .reg 文件,这些文件基于 Gary Kindel 的答案:启用禁用
196赞 Samuel Jack 5/19/2010 #3

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

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

评论

6赞 Tim Lovell-Smith 8/25/2010
这些按钮对我来说是禁用的 - 为什么?
14赞 Samuel Jack 9/24/2010
@Tim,以前没有见过 - 这可能与管理员权限有关吗?毕竟,正在修改的是HKEY_LOCAL_MACHINE。
2赞 pauloya 8/16/2011
“设置,日志绑定失败”足以找到我的问题。
1赞 Edward Wilde 2/20/2013
确保该文件夹允许写入访问权限。UAC 和 c:\logs 不能很好地与融合日志配合使用
4赞 Bruno Lopes 3/8/2013
请注意,如果按钮被禁用,请使用管理员权限重新运行融合日志查看器。
303赞 Mike Goatly 7/15/2010 #4

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

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

完成后,请记住关闭注销!

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

评论

4赞 jpierson 10/4/2012
请注意,如果您自己从本机应用程序托管运行时,出于某种原因,您将需要使用自定义日志路径,否则您将不会记录任何内容。
0赞 Josh 8/1/2014
至少在我的情况下,我实际上不必设置自定义日志路径。我所要做的就是打开日志记录,例如,设置对话框中的“将所有绑定记录到磁盘”。
52赞 vezenkov 8/12/2016
在我的情况下,需要以管理员身份运行,否则所有选项都被禁用。
2赞 Tabrock 5/11/2017
注意:以管理员身份创建文件夹!
6赞 Veverke 6/12/2017
请确保你不仅以管理员身份运行,而且还从引发异常的 Visual Studio 项目正在使用的正确 Windows SDK 路径运行。检查其 csproj 并在其中搜索 SDK(我的 sdk 节点名为 )。使用不匹配的 fuslogvw 版本似乎无法捕获异常(这是有道理的......fuslogvwTargetFrameworkSDKToolsDirectory
21赞 Adam Tuliper 10/21/2011 #5

Fusion Log Settings Viewer更改器脚本是执行此操作的最佳方法。

在 ASP.NET 中,有时很难让它正常工作。这个脚本效果很好,也被列入了 Scott Hanselman 的 Power Tool 列表。我个人已经使用它多年了,它从未让我失望。

评论

0赞 Adam Tuliper 9/19/2012
ps 确保在运行后禁用它,否则此文件夹可能会变得非常大
0赞 magicandre1981 4/3/2015
这就是我使用 ETW 的原因,只在真正需要数据时才记录数据,而不是一直记录在丑陋的大型日志文件中。
3赞 Adam Mendoza 4/18/2012 #6

如果您已经启用了日志记录,但在 Windows 7 64 位上仍然收到此错误,请在 IIS 7.5 中尝试以下操作:

  1. 创建新的应用程序池

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

  3. 将“启用 32 位应用程序”设置为“true

  4. 将 Web 应用程序指向使用此新池

4赞 andrerav 7/18/2013 #7

只是一点点可能对他人有帮助的信息;如果按照在某个目录中搜索所有程序集以查找继承/实现类/接口的类的思路执行某些操作,则请确保在收到与自己的程序集之一相关的错误时清除过时的程序集。

场景如下:

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

简而言之:A ---loads--> B(陈旧)---引用---> C

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

16赞 magicandre1981 4/1/2015 #8

除了使用丑陋的日志文件外,还可以通过 ETW/xperf 激活 Fusion 日志,方法是打开 DotnetRuntime 专用提供程序 () 和 GUID 和关键字 (0x4)。Microsoft-Windows-DotNETRuntimePrivate763FD754-7086-4DFE-95EB-C01A46FAF4CAFusionKeyword

@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 文件并在“事件”表下查看时,可以找到 Fusion 数据:

Fusion events in PerfView

评论

0赞 magicandre1981 9/17/2015
@YuriBondarchuk这会按需激活它,并且您在 ETL 中拥有更多数据(其他进程、文件版本数据),以便您可以向其他用户提供文件,并且与普通融合日志相比,他们可以获得更多信息
112赞 Tereza Tomcova 10/8/2015 #9

你可以以管理员身份运行此 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

评论

6赞 Oliver 10/31/2015
谢谢!我允许自己把你的命令放进这个要点。我添加了目录的创建,这样人们就不会忘记这一点;-)c:\FusionLog
0赞 cwhsu 7/12/2020
这个答案更有用,我上次把它放到我的脚本中。几个月后,我回到这里,再次看到了这条线。让我想起我上次如何使用它。
4赞 Dikshit Kathuria 10/27/2018 #10

以防万一您想知道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 工具\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

-2赞 Vlad 1/21/2019 #11

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

错误 - C:\someFolder

正确 - c:\someFolder

评论

1赞 ecnepsnai 11/18/2021
这与问题有什么关系?
0赞 Vlad 11/24/2021
我将其用作注册表中 LogPath 参数的值。但现在我认为问题不在于 CASE,而在于错误的字母 C != С
6赞 Igor Meszaros 5/8/2019 #12

对于那些有点懒惰的人,我建议在你想启用它时将其作为 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
47赞 Waescher 5/10/2019 #13

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

您可以从此处或通过 chocolatey () 获取最新版本。choco install fusionplusplus

我希望你和这里的一些游客可以用它来节省一些有价值的终生时间。

Fusion++

3赞 Igor Levicki 10/16/2022 #14

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

  • 如果您曾经启用此日志记录,请不要忘记禁用它,否则您以后会后悔的。

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

文件数量大于 300 万,Total Commander 和 Windows 资源管理器都无法在不挂起的情况下显示内容或文件夹大小。

在禁用日志记录并重新启动以达到良好措施后,我从命令提示符运行删除。

删除三星 970 Pro SSD 上的所有文件花了 15 分钟多的时间,该 SSD 一直显示 100% 的磁盘使用率——我的高端 PC 工作站被这次删除操作打倒在地,直到完成才保持部分响应。