首页 文章

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

提问于
浏览
739

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

10 回答

  • 0

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

    • 以管理员身份打开Fusion Log Viewer

    • 点击 settings

    • 选中 Enable custom log path 复选框

    • 输入要写入日志的位置,例如 c:\FusionLogsImportant: 确保您已在文件系统中实际创建了此文件夹 . )

    • 确保启用了正确的日志记录级别(我有时只选择 Log all binds to disk 以确保操作正常)

    • 点击 OK

    • 将日志位置选项设置为 Custom

    一旦完成,请记得关闭注销!

    (我刚刚在类似的问题上发布了这个问题 - 我认为这也是相关的 . )

  • 9

    您也可以通过打开带有GUID 763FD754-7086-4DFE-95EB-C01A46FAF4CAFusionKeyword 关键字(0x4)的DotnetRuntime专用提供程序( Microsoft-Windows-DotNETRuntimePrivate )来激活通过ETW/xperf的Fusion日志,而不是使用丑陋的日志文件 .

    @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数据:

  • 183

    添加以下值

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

    确保文件夹名称后面的 include the backslashFolder exists .

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

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

  • 57

    只需要一点点可以帮助他人的信息;如果您在某些目录中搜索继承/实现类/接口的类的所有程序集,那么请确保在收到与您自己的程序集相关的错误时清除过时的程序集 .

    场景将是这样的:

    • 程序集A加载某个文件夹中的所有程序集

    • 此文件夹中的程序集B过时,但引用程序集C

    • 程序集C存在,但命名空间,类名或其他一些细节可能在程序集B过时后已经过去的时间内发生了变化(在我的例子中,命名空间是通过重构过程更改的)

    简而言之:A ---加载 - > B(陈旧)---参考---> C.

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

  • 3

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

    • 创建新的应用程序池

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

    • 将启用32位应用程序设置为True

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

  • 771

    设置以下注册表值:

    [HKEY_LOCAL_MACHINE \ SOFTWARE \ 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资源管理器运行该文件,并忽略有关可能的损坏的警告 .

  • 83

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

    注意:确保为LogPath条目提供的目录存在 . 如果该目录不存在,那么您的日志将无法检索 .

    这个禁用:

    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
    
  • 19

    Fusion Log Settings Viewer changer script不是最好的方法 .

    ASP.NET中,有时让它正常工作一直很棘手 . 这个脚本很好用,也列在Scott Hanselman's Power Tool list上 . 我个人已经使用了多年,它永远不会让我失望 .

  • 2

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

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

  • 230

    万一你想知道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

相关问题