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


818

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


46
如果有人在意,请使用融合记录器(fuslogvw.exe)阅读此文章:msdn.microsoft.com/zh-cn/library/e74a18c4 (v=VS.100).aspx, 它告诉您从何处下载它以及其他信息。

13
@Will-感谢您的分享!另外,请确保您fuslogvw.exe以管理员身份运行,以避免出现任何权限问题。
SliverNinja-MSFT 2012年

13
@我不同意安装fuslogvw是“最佳”答案。如果您只需要工具而不必在可能不是开发环境的地方安装整个Windows SDK,那么您会很对。
Coxy

2
@Will当然可以,但是您链接到的答案不包含任何内容。
Coxy 2016年

8
@请不要那么幼稚。您是通过尝试提出一个答案来收集代表的人,虽然有用,但社区判断出的帮助比其他人少,一个社区要容易得多,而另一个社区实际上是相同的。
Coxy

Answers:


868

将以下值添加到

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Fusion
加:
DWORD ForceLog将值设置为1
DWORD LogFailures将值设置为1
DWORD LogResourceBinds将值设置为1
DWORD EnableLog将值设置为1
字符串LogPath将值设置为日志文件夹(例如C:\ FusionLog \)

确保在文件夹名称后加上反斜杠,并且该文件夹存在

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

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

在此处输入图片说明


23
Gary的解决方案对我有用,尽管我还必须重置IIS。请注意,我是在不想安装SDK之类的干净环境中配置此文件的。
Michhes

5
一些人报告说,注册表更改不会马上生效。您是否尝试过打开Fusion记录然后重新启动?
加里·金德尔

54
您需要重新启动正在运行的程序,才能读取这些注册表设置
Orion Edwards

50
Fusion Log Viewer可以为您完成所有这些工作。转到“开始”->“程序”->“ Visual Studio xxxx”>“ Visual Studio工具”>“ Visual Studio命令提示符”(以管理员身份运行),然后键入“ fuslogvw”。在设置中,您可以调整日志记录。
r3mark

10
要打开/关闭日志记录方便,我创建的.reg文件,是基于加里·金德尔的回答是:启用禁用
Igor Kustov

271

我通常使用的融合日志查看器(Fuslogvw.exeVisual Studio的命令提示符下从开始菜单或Fusion日志查看器) -我的标准设置为:

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

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

(我刚刚将其发布在类似的问题上-我认为这也很重要。)


4
请注意,在您自己从本机应用程序托管运行时的情况下,由于某些原因,您将需要使用自定义日志路径,否则将不会记录任何内容。
jpierson 2012年

至少在我的情况下,我实际上不必设置自定义日志路径。我要做的就是打开登录,例如,设置对话框中的“记录所有绑定到磁盘”。
2014年

42
在我的情况下,需要以管理员身份运行,否则所有选项都被禁用。
vezenkov'8

2
注意:将文件夹创建为Admin!
塔普洛克

6
确保您fuslogvw不仅以admin身份运行,而且还以引发异常的Visual Studio项目正在使用的正确 Windows SDK路径运行。检查其csproj并在其中搜索SDK(我的sdk节点名为TargetFrameworkSDKToolsDirectory)。使用不匹配的fuslogvw版本似乎无法捕获异常(这很有意义...)
Veverke

191

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

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


6
这些按钮对我来说是禁用的-为什么?
蒂姆·洛弗尔-史密斯

14
@Tim,以前没见过-与管理权限有关吗?毕竟是HKEY_LOCAL_MACHINE。
塞缪尔·杰克

2
“设置,日志绑定失败”足以找到我的问题。
pauloya 2011年

1
确保文件夹允许写访问。UAC和c:\ logs不能与融合日志配合使用
Edward Wilde

4
请注意,如果禁用了按钮,请使用管理员权限重新运行Fusion Log Viewer。
布鲁诺·洛佩斯

86

设置以下注册表值:

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

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

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

Windows Registry Editor Version 5.00

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

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


4
并不是说该条目可能不存在-您必须创建它。至少在今天早上坠机前我要回答这个问题的时候,我做了:)
乔恩·斯基特

3
什么!意思?关键还是价值?那64位系统呢?
布鲁诺·马丁内斯

48
实际上,这确实有效...您只需要运行iisreset后置字词即可使其正常工作。
Nick DeMayo 2010年

4
@Norman:因为此特定设置用于使Asp.Net错误在错误页面中显示程序集绑定错误消息,而不是将日志保存到文件。@OP:+1。编辑为包含.reg文件。!格式是我从未见过的格式,但错误消息使我无法访问此页面以寻找答案。
布莱恩

2
您不需要重置IIS,只需重置相关的应用程序池即可。或至少这就是我要做的。
肯尼·埃维特

81

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

4
谢谢!我已经允许自己将您的命令放入这个要点。而且我添加了c:\FusionLog目录的创建,以便人们不会忘记它;-)
Oliver

命令行规则!我可以使用迄今为止发明的最好的代码可重用性技术(称为“剪切和粘贴”)快速重播此内容。谢谢。
RemigijusPankevičius19年


13

除了使用丑陋的日志文件,您还可以通过使用GUID 和关键字(0x4)打开DotnetRuntime Private提供程序(),通过ETW / xperf激活Fusion日志。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数据:

PerfView中的融合事件


@YuriBondarchuk会按需激活它,并且您在ETL中拥有更多数据(其他进程,文件版本数据),因此您可以将这些文件提供给其他用户,并且与普通的融合日志相比,他们可以获得更多的信息
magicandre1981


3

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

  1. 创建一个新的应用程序池

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

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

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


伙计,您保存我的一天,我花了大约8个小时解决了问题。非常感谢。:)
Dika Arta Karunia

3

只是一小部分可以帮助他人的信息;如果您沿着某个目录中的所有程序集搜索继承/实现类/接口的类而执行某些操作,那么如果遇到与您自己的程序集有关的错误,请确保清除陈旧的程序集。

该场景将类似于:

  1. 程序集A将所有程序集加载到某个文件夹中
  2. 该文件夹中的程序集B是陈旧的,但引用了程序集C
  3. 程序集C存在,但是自程序集B失效以来,名称空间,类名或其他详细信息可能已更改(在我的情况下,通过重构过程更改了名称空间)

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

如果发生这种情况,则唯一的错误标志是错误消息中的名称空间和类名。仔细检查。如果您无法在解决方案中的任何位置找到它,则可能是试图加载陈旧的程序集。


3

对于那些比较懒惰的人,我建议将其作为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

1

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


0

就我而言,有助于键入小写的磁盘名称

错误 -C:\ someFolder

正确 -c:\ someFolder

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.