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


818

.NET에서 어셈블리 바인드 실패 로깅 (Fusion)을 어떻게 활성화합니까?


46
사용 융합 로거 (fuslogvw.exe)에 사람의 염려가이 문서를 읽을 경우 msdn.microsoft.com/en-us/library/e74a18c4(v=VS.100).aspx를 이 곳과 다른 정보를 다운로드하는 방법을 알려줍니다.

13
@Will-공유해 주셔서 감사합니다! 보너스로- fuslogvw.exe권한 문제를 피하기 위해 관리자 권한으로 실행하십시오 .
SliverNinja-MSFT

13
@ fuslogvw 설치가 "최상의"답변이라는 데 동의하지 않습니다. 개발 환경이 아닌 환경에 전체 Windows SDK를 설치하지 않고도 도구를 얻을 수 있다면 중요한 점이 있습니다.
Coxy

2
@Will 확실히, 그러나 당신이 연결하는 대답은 그 중 어느 것도 다루지 않습니다.
Coxy

8
@Will 제발 너무 유치하지 마십시오. 귀하는 커뮤니티가 다른 사람들보다 도움이 덜하다고 판단한 답변을 홍보함으로써 담당자를 모 으려고 노력하는 사람입니다. 하나는 훨씬 쉬우 며 다른 하나는 실질적으로 동일합니다.
Coxy

답변:


868

다음 값을 추가하십시오

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Fusion
더하다:
DWORD ForceLog 설정 값을 1
DWORD LogFailures 설정 값을 1
DWORD LogResourceBinds 값을 1로 설정
DWORD EnableLog 설정 값을 1로 설정
문자열 LogPath 설정 값을 로그 폴더 (예 : C : \ FusionLog \)

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

해당 레지스트리 설정을 읽도록 실행중인 프로그램을 다시 시작해야합니다.

그건 그렇고, 필요하지 않은 경우 퓨전 로깅을 해제하는 것을 잊지 마십시오.

여기에 이미지 설명을 입력하십시오


23
IIS를 재설정하여 따라야했지만 Gary의 솔루션이 효과적이었습니다. 참고 SDK 등을 설치하지 않으려는 깨끗한 환경에서이를 구성했습니다.
Michhes

5
레지스트리 변경이 즉시 수행되지 않는다고 일부 사람들이보고했습니다. Fusion 로깅을 켠 다음 다시 부팅 해 보셨습니까?
Gary Kindel

54
레지스트리 설정을 읽으려면 실행중인 프로그램을 다시 시작해야합니다.
Orion Edwards

50
Fusion Log Viewer는 모든 기능을 제공합니다. 시작-> 프로그램-> Visual Studio xxxx> Visual Studio 도구> Visual Studio 명령 프롬프트 (관리자로 실행)로 이동하여 "fuslogvw"를 입력하십시오. 설정에서 로깅을 조정합니다.
r3mark

10
: 편리한 로깅 켜기 / 끄기 위해, 나는 게리 Kindel에게의 대답을 기반으로 파일을 .reg 만든 활성화비활성화를 .
Igor Kustov

271

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

  • 관리자로 Fusion Log Viewer 열기
  • 클릭 설정
  • 체크 사용 사용자 정의 로그 경로 체크 박스를
  • 예를 들어, 로그를 기록 할 위치를 입력하십시오 c:\FusionLogs( 중요 : 파일 시스템에서이 폴더를 실제로 작성했는지 확인하십시오).
  • 올바른 수준의 로깅이 설정되어 있는지 확인하십시오 (때때로 모든 바인드를 디스크에 기록을 선택하여 올바르게 작동하는지 확인합니다)
  • 확인을 클릭하십시오
  • 로그 위치 옵션을 사용자 정의로 설정하십시오.

완료되면 로그 오프를 해제하십시오!

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


4
네이티브 애플리케이션에서 직접 런타임을 호스팅하는 경우 어떤 이유로 든 사용자 정의 로그 경로를 사용해야하며, 그렇지 않으면 아무것도 기록되지 않습니다.
jpierson

적어도 내 상황에서는 실제로 사용자 정의 로그 경로를 설정할 필요가 없었습니다. 설정 대화 상자에서 "모든 바인드 디스크에 로그"와 같이 로깅을 설정하기 만하면됩니다.
Josh

42
필자의 경우 관리자 권한으로 실행이 필요했습니다. 그렇지 않으면 모든 옵션이 비활성화되었습니다.
vezenkov

2
참고 : 폴더를 관리자로 만드십시오!
Tabrock

6
fuslogvw관리자뿐만 아니라 Visual Studio 프로젝트에서 예외를 발생 시키는 올바른 Windows SDK 경로 에서 실행 중인지 확인하십시오 . csproj를 확인하고 SDK 내에서 SDK를 검색하십시오 TargetFrameworkSDKToolsDirectory. 비 일치 fuslogvw 버전을 사용하면 (이 말이 ...) 예외를 잡을 것 같다
Veverke

191

컴퓨터에 Windows SDK가 설치되어 있으면 Microsoft SDK \ Tools 아래에 "Fusion Log Viewer"가 있습니다 (Vista 또는 Windows 7/8의 시작 메뉴에 "Fusion"을 입력하면됩니다). 시작하고 설정 버튼을 클릭 한 다음 "바인드 실패 로그"또는 "모든 바인드 로그"를 선택하십시오.

이 버튼이 비활성화되어 있으면 시작 메뉴로 돌아가서 로그 뷰어를 마우스 오른쪽 단추로 클릭 한 다음 "관리자 권한으로 실행"을 선택하십시오.


6
저 버튼들은 저를 위해 비활성화되어 있습니다-왜?
Tim Lovell-Smith

14
@Tim, 전에는 보지 못했습니다-관리자 권한과 관련이 있습니까? 결국 수정되는 것은 HKEY_LOCAL_MACHINE입니다.
사무엘 잭

2
"설정, 로그 바인드 실패"가 내 문제를 찾기에 충분했습니다.
pauloya

1
폴더가 쓰기 액세스를 허용하는지 확인하십시오. UAC와 C : \ 로그 융합 로그와 함께 좋은 재생되지 않습니다
에드워드 와일드에게

4
참고로 버튼이 비활성화 된 경우 관리자 권한으로 퓨전 로그 뷰어를 다시 실행하십시오.
Bruno Lopes

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
해당 항목이 존재하지 않을 수도 있으므로 작성해야합니다. 적어도 오늘 아침 충돌 직전이 질문에 대답하려고했을 때 :)
Jon Skeet

3
무엇입니까! 평균? 열쇠 또는 ​​가치? 64 비트 시스템은 어떻습니까?
Bruno Martinez

48
실제로, 이것은 작동합니다 ... 작동하기 위해서는 iisreset afterwords를 실행하면됩니다.
Nick DeMayo

4
@Norman :이 특정 설정은 Asp.Net 오류가 로그에 파일을 저장하지 않고 오류 페이지에 어셈블리 바인딩 오류 메시지를 표시하는 데 사용되기 때문입니다. @OP : +1 .reg 파일을 포함하도록 편집되었습니다. ! format은 답을 찾기 위해이 페이지로 보낸 오류 메시지를 제외하고는 내가 본 적이없는 형식입니다.
Brian

2
IIS를 재설정 할 필요는 없으며 관련 응용 프로그램 풀만 있으면됩니다. 아니면 적어도 그게 내가해야 할 전부였습니다.
Kenny Evitt

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그 사람들이 그 ;-) 잊지 않도록 DIR을
올리버

명령 줄 규칙! "잘라 내기 및 붙여 넣기"라고하는 지금까지 개발 된 최고의 코드 재사용 기술을 사용하여이를 빠르게 재생할 수 있습니다. 감사.
Remigijus Pankevičius

20

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

ASP.NET 에서는 올바르게 작동하기가 까다로 웠습니다. 이 스크립트는 훌륭하게 작동하며 Scott Hanselman의 Power Tool 목록 에도 포함되어 있습니다. 나는 수년간 개인적으로 사용해 왔으며 결코 실망시키지 않았습니다.


ps MAKE를 실행하면 실행 후 폴더를 비활성화
하거나이

그렇기 때문에 ETW를 사용하여 데이터가 필요한 경우에만 데이터를 기록 할 수 있습니다.
magicandre1981

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 파일을 열고 Events 테이블을 보면 Fusion 데이터를 찾을 수 있습니다.

PerfView의 퓨전 이벤트


@YuriBondarchuk 이것은 주문형으로이를 활성화하고 ETL에 더 많은 데이터 (다른 프로세스, 파일 버전 데이터)를 가지고있어 다른 사용자에게 파일을 제공 할 수 있고 일반 퓨전 로그와 비교하여 더 많은 정보를 얻을 수 있습니다
magicandre1981

12

Fusion ++ 이라는 어셈블리 바인딩 로그 뷰어를 작성하여 GitHub에 넣었습니다 .

최신 릴리스는 여기에서 또는 초콜릿 ( choco install fusionplusplus)을 통해 얻을 수 있습니다 .

나는 당신과 여기에 일부 방문자가 그것으로 가치있는 일생 분을 절약 할 수 있기를 바랍니다.

퓨전 ++


1
친애하는 각하, 당신은 신입니다!
Sylvain Girard 2016 년

1
정말 놀라운 도구입니다. 정말 감사합니다!
simoneL

3

이미 로깅을 사용하도록 설정했지만 Windows 7 64 비트에서이 오류가 계속 발생하면 IIS 7.5에서이를 시도하십시오.

  1. 새로운 응용 프로그램 풀 만들기

  2. 이 응용 프로그램 풀의 고급 설정으로 이동

  3. 설정 32 비트 응용 프로그램 사용 에 대한 사실을

  4. 이 새로운 풀을 사용하도록 웹 응용 프로그램을 가리 킵니다.


남자, 당신은 내 하루를 저장, 나는 문제를 해결하는 데 약 8 시간이 걸렸습니다. 많은 감사합니다. :)
Dika Arta Karunia

3

다른 사람들을 도울 수있는 작은 정보입니다. 클래스 / 인터페이스를 상속 / 구현하는 클래스에 대해 일부 디렉토리의 모든 어셈블리를 검색하는 행을 따라 무언가를 수행하는 경우 자체 어셈블리 중 하나와 관련된 오류가 발생하면 오래된 어셈블리를 정리하십시오.

시나리오는 다음과 같습니다.

  1. 어셈블리 A는 일부 폴더의 모든 어셈블리를로드합니다
  2. 이 폴더의 어셈블리 B가 오래되었지만 어셈블리 C를 참조합니다.
  3. 어셈블리 C가 존재하지만 어셈블리 B가 오래 된 이후 경과 한 시간에 네임 스페이스, 클래스 이름 또는 기타 세부 사항이 변경되었을 수 있습니다 (제 경우에는 리팩토링 프로세스를 통해 네임 스페이스가 변경됨)

한마디로 : A ---로드-> B (스테일) --- 참조 ---> C

이런 일이 발생하면 오류 메시지의 유일한 네임 스페이스와 클래스 이름이 나타납니다. 자세히 조사하십시오. 솔루션의 어느 곳에서나 찾을 수 없으면 오래된 어셈블리를로드하려고합니다.


3

약간 게으른 사람들을 위해 이것을 활성화하고 싶을 때마다 박쥐 파일로 실행하는 것이 좋습니다.

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를 찾고있었습니다. FUSION LOG .NET 4.5 버전으로 이동 한 후 폭발했습니다. 그녀는 설치 한 소프트웨어에 따라 디스크에서 찾을 수있는 위치입니다.

C : \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 도구 \ x64

C : \ 프로그램 파일 (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


0

필자의 경우 디스크 이름을 소문자로 입력하는 데 도움이되었습니다.

잘못 -C : \ someFolder

올바른 -c : \ someFolder

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.