program story

.NET에서 어셈블리 바인딩 실패 로깅 (Fusion)을 활성화하는 방법

inputbox 2020. 9. 29. 07:44
반응형

.NET에서 어셈블리 바인딩 실패 로깅 (Fusion)을 활성화하는 방법


.NET에서 어셈블리 바인딩 실패 로깅 (Fusion)을 활성화하려면 어떻게해야합니까?


다음 값을 추가하십시오.

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Fusion
더하다:
DWORD ForceLog 설정 값을 1로 설정
DWORD LogFailures 값을 1로 설정
DWORD LogResourceBinds는 값을 1로 설정합니다.
DWORD EnableLog 설정 값을 1로 설정
로그 용 폴더에 대한 문자열 LogPath 설정 값 (예 : C : \ FusionLog \)

폴더 이름 뒤에 백 슬래시포함 하고 폴더가 있는지 확인하십시오 .

이러한 레지스트리 설정을 읽도록하려면 실행중인 프로그램을 다시 시작해야합니다.

BTW, 필요하지 않을 때 퓨전 로깅을 끄는 것을 잊지 마십시오.


나는 보통 퓨전 로그 뷰어 사용 ( Fuslogvw.exe를 A로부터 의 Visual Studio 명령 프롬프트 시작 메뉴에서 또는 퓨전 로그 뷰어) - 내 표준 설정은 다음과 같습니다

  • 관리자 권한으로 Fusion Log Viewer 열기
  • 클릭 설정
  • 체크 사용 사용자 정의 로그 경로 체크 박스를
  • 예를 들어, 로그를 기록 할 위치를 입력하십시오. c:\FusionLogs( 중요 : 파일 시스템에이 폴더를 실제로 생성했는지 확인하십시오.)
  • 올바른 수준의 로깅이 켜져 있는지 확인합니다 (때로는 모든 것이 제대로 작동하는지 확인하기 위해 Log all binds to disk를 선택 합니다 )
  • 클릭 OK
  • 로그 위치 옵션을 사용자 지정으로 설정합니다.

완료되면 로그 오프를 해제하는 것을 잊지 마십시오!

(나는 방금 비슷한 질문에 이것을 게시했습니다-여기에서도 관련이 있다고 생각합니다.)


컴퓨터에 Windows SDK가 설치되어있는 경우 Microsoft SDK \ Tools에서 "Fusion Log Viewer"를 찾을 수 있습니다 (Vista 또는 Windows 7/8의 시작 메뉴에서 "Fusion"을 입력하기 만하면 됨). 실행하고 설정 버튼을 클릭 한 다음 "로그 바인딩 실패"또는 "모든 바인딩 로그"를 선택합니다.

이 버튼이 비활성화 된 경우 시작 메뉴로 돌아가 로그 뷰어를 마우스 오른쪽 버튼으로 클릭 한 다음 "관리자 권한으로 실행"을 선택합니다.


다음 레지스트리 값을 설정하십시오.

[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 탐색기에서 파일을 실행하고 손상 가능성에 대한 경고를 무시하십시오.


이 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

퓨전 로그 설정 뷰어 체인저 스크립트는 것도이 할 수있는 최선의 방법을 바 없다.

ASP.NET 에서는 이 기능이 제대로 작동하도록하는 것이 때때로 까다로 웠습니다. 이 스크립트는 훌륭하게 작동하며 Scott Hanselman의 Power Tool 목록 에도 포함되었습니다. 나는 개인적으로 수년 동안 그것을 사용해 왔으며 결코 나를 실망시키지 않았습니다.


추악한 로그 파일을 사용하는 대신 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

When you now open the ETL file in PerfView and look under the Events table, you can find the Fusion data:

Fusion events in PerfView


I wrote an assembly binding log viewer named Fusion++ and put it on GitHub.

You can get the latest release from here or via chocolatey (choco install fusionplusplus).

I hope you and some of the visitors in here can save some worthy lifetime minutes with it.

Fusion++


Just a tiny bit of info that might help others; if you do something along the lines of searching all assemblies in some directory for classes that inherit/implement classes/interfaces, then make sure you clean out stale assemblies if you get this error pertaining to one of your own assemblies.

The scenario would be something like:

  1. Assembly A loads all assemblies in some folder
  2. Assembly B in this folder is stale, but references assembly C
  3. Assembly C exists, but namespaces, class names or some other detail might have changed in the time that has passed since assembly B became stale (in my case a namespace was changed through a refactoring process)

In short: A ---loads--> B (stale) ---references---> C

If this happens, the only telltale sign is the namespace and classname in the error message. Examine it closely. If you can't find it anywhere in your solution, you are likely trying to load a stale assembly.


If you already have logging enabled and you still get this error on Windows 7 64 bit, try this in IIS 7.5:

  1. Create a new application pool

  2. Go to the Advanced Settings of this application pool

  3. Set the Enable 32-Bit Application to True

  4. Point your web application to use this new pool


Just in case you're wondering about the location of FusionLog.exe - You know you have it, but you cannot find it? I was looking for FUSLOVW in last few years over and over again. After move to .NET 4.5 number of version of FUSION LOG has exploded. Her are places where it can be found on your disk, depending on software which you have installed:

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 Tools

C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin


For those who are a bit lazy, I recommend running this as a bat file for when ever you want to enable it:

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

In my case helped type disk name in lower case

Wrong - C:\someFolder

Correct - c:\someFolder

참고URL : https://stackoverflow.com/questions/255669/how-to-enable-assembly-bind-failure-logging-fusion-in-net

반응형