Como habilitar o log de falha de ligação de montagem (Fusion) no .NET

818

Como habilito o log de falha de ligação de montagem (Fusion) no .NET?

user32736
fonte
46
Se alguém se importa, para usar o logger de fusão (fuslogvw.exe), leia este artigo: msdn.microsoft.com/en-us/library/e74a18c4(v=VS.100).aspx , informando onde fazer o download e outras informações.
13
@ Will - obrigado por compartilhar! Como bônus - lembre-se de executar fuslogvw.execomo administrador para evitar problemas de direitos.
SliverNinja - MSFT 27/02
13
@ Discordo que a instalação do fuslogvw seja a "melhor" resposta. Se você pudesse obter apenas a ferramenta sem precisar instalar todo o SDK do Windows no que provavelmente não é um ambiente de desenvolvimento, você teria razão.
Coxy
2
@ Certamente, mas a resposta para a qual você vincula não cobre nada disso.
Coxy
8
@ Will Por favor, não seja tão infantil sobre isso. Você é quem está tentando obter representantes promovendo uma resposta que, embora útil, a comunidade tenha julgado menos útil que outras, uma que é muito mais fácil e outra que é praticamente a mesma.
Coxy

Respostas:

868

Adicione os seguintes valores a

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Fusion
Adicionar:
DWORD ForceLog define o valor como 1
DWORD LogFailures define o valor como 1
DWORD LogResourceBinds define o valor como 1
DWORD EnableLog define o valor como 1
String LogPath define o valor para a pasta dos logs (por exemplo, C: \ FusionLog \)

Certifique-se de incluir a barra invertida após o nome da pasta e de que a pasta existe .

Você precisa reiniciar o programa em execução para forçá-lo a ler essas configurações do Registro.

A propósito, não esqueça de desativar o log de fusão quando não for necessário.

insira a descrição da imagem aqui

Gary Kindel
fonte
23
As soluções de Gary funcionaram para mim, embora eu também tenha que seguir redefinindo o IIS. Observe que eu configurei isso em um ambiente limpo, onde não queria instalar SDKs e similares.
Michhes
5
Foi relatado por alguns que a alteração do registro não é imediata. Você já tentou ativar o log do Fusion e depois reiniciar?
Gary Kindel
54
Você precisa reiniciar qualquer programa que é que você está correndo para ele ler essas configurações de registro
Orion Edwards
50
O Fusion Log Viewer faz tudo isso para você. Vá para Iniciar -> Programas -> Visual Studio xxxx> Ferramentas do Visual Studio> Prompt de comando do Visual Studio (executado como administrador) e digite "fuslogvw". Em Configurações, você ajusta o log.
R3mark
10
Para ativar / desativar o registro, criei arquivos .reg, baseados na resposta de Gary Kindel: ativar e desativar .
Igor Kustov
271

Normalmente, uso o Fusion Log Viewer ( Fuslogvw.exe em um prompt de comando do Visual Studio ou Fusion Log Viewer no menu Iniciar) - minha configuração padrão é:

  • Abra o Fusion Log Viewer como administrador
  • Clique em configurações
  • Marque a caixa de seleção Ativar caminho do log personalizado
  • Digite o local em que você deseja gravar os registros, por exemplo, c:\FusionLogs( Importante: verifique se você realmente criou esta pasta no sistema de arquivos.)
  • Verifique se o nível correto de log está ativado (às vezes eu apenas seleciono Log all binds to disk apenas para garantir que tudo esteja funcionando corretamente)
  • Clique em OK
  • Defina a opção local do log como Personalizado

Lembre-se de desativar o logoff quando terminar!

(Acabei de postar isso em uma pergunta semelhante - acho que é relevante aqui também.)

Mike Goatly
fonte
4
Observe que, nos casos em que você está hospedando o tempo de execução a partir de um aplicativo nativo, será necessário usar um caminho de log personalizado por algum motivo, caso contrário, você não obterá nada registrado.
jpierson
Pelo menos na minha situação, eu realmente não precisava definir os caminhos de log personalizados. Tudo o que eu precisava fazer era ativar o logon, por exemplo, "Registrar todas as ligações ao disco" na caixa de diálogo de configurações.
31414 Josh
42
Executar como administrador foi necessário no meu caso, caso contrário, todas as opções foram desabilitadas.
vezenkov 12/08
2
Nota: crie a pasta como Admin!
Tabrock
6
Verifique se você está executando fuslogvwnão apenas como administrador, mas também no caminho correto do SDK do Windows que o projeto do Visual Studio que está lançando a exceção está usando. Verifique seu csproj e procure o SDK dentro (meu nó sdk é chamado TargetFrameworkSDKToolsDirectory). Usando uma versão não fuslogvw correspondência parece não capturar as exceções (o que faz sentido ...)
Veverke
191

Se você tiver o Windows SDK instalado em sua máquina, encontrará o "Fusion Log Viewer" em Microsoft SDK \ Tools (basta digitar "Fusion" no menu Iniciar do Vista ou Windows 7/8). Inicie-o, clique no botão Configurações e selecione "Falha na ligação do log" ou "Log all binds".

Se esses botões estiverem desativados, volte ao menu Iniciar, clique com o botão direito do mouse no Log Viewer e selecione "Executar como Administrador".

Samuel Jack
fonte
6
Esses botões estão desativados para mim - por quê?
Tim Lovell-Smith
14
@ Tim, não vi isso antes - poderia ter a ver com privilégios de administrador? Afinal, é HKEY_LOCAL_MACHINE que está sendo modificado.
Samuel Jack
2
"Configurações, falhas de ligação do log" foi suficiente para encontrar o meu problema.
pauloya 16/08
1
Verifique se a pasta permite acesso de gravação. UAC e C: \ logs não jogar bonito com o registo de fusão
Edward Wilde
4
Apenas como observação, se os botões estiverem desativados, execute novamente o visualizador de logs de fusão com privilégios de administrador.
Bruno Lopes
86

Defina o seguinte valor do registro:

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

Para desativar, defina como 0 ou exclua o valor.

[edit]: Salve o seguinte texto em um arquivo, por exemplo, FusionEnableLog.reg, no formato do Editor do Registro do Windows:

Windows Registry Editor Version 5.00

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

Em seguida, execute o arquivo no Windows Explorer e ignore o aviso sobre possíveis danos.

user32736
fonte
4
Não que a entrada provavelmente não exista - você terá que criá-la. Pelo menos, eu fiz quando eu estava prestes a responder a esta pergunta, pouco antes do acidente esta manhã :)
Jon Skeet
3
O que faz o ! significar? Chave ou valor? E quanto aos sistemas de 64 bits?
de Bruno Martinez
48
na verdade, isso funciona ... você só precisa executar o afteris do iisreset para fazê-lo funcionar.
precisa
4
@ Norman: Como essa configuração específica é usada para fazer com que os erros do Asp.Net mostrem mensagens de erro de associação de montagem nas páginas de erro, não para salvar os logs no arquivo. @OP: +1. Editado para incluir um arquivo .reg. O ! O formato é o que eu nunca tinha visto, exceto na mensagem de erro que me enviou a esta página procurando respostas.
Brian
2
Você não precisa redefinir o IIS - apenas o pool de aplicativos relevante. Ou pelo menos era tudo o que eu precisava fazer.
precisa saber é o seguinte
81

Você pode executar esse script do Powershell como administrador para ativar o 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

e este para desativar:

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
Tereza Tomcova
fonte
4
Obrigado! Eu me permiti colocar seus comandos nessa essência . E acrescentei criação do c:\FusionLogdir para que as pessoas não se esqueça que ;-)
Oliver
Regras de linha de comando! Eu pude reproduzir rapidamente isso usando a melhor tecnologia de reutilização de código até agora inventada chamada "recortar e colar". Obrigado.
Remigijus Pankevičius 17/01/19
20

O script do trocador do Fusion Log Settings Viewer não é a melhor maneira de fazer isso.

No ASP.NET , às vezes é complicado fazer com que isso funcione corretamente. Esse script funciona muito bem e também foi listado na lista de ferramentas elétricas de Scott Hanselman . Eu pessoalmente o uso há anos e nunca me decepcionou.

Adam Tuliper - MSFT
fonte
ps Certifique-se de desativá-lo depois de executar ou esta pasta poderia ficar muito grande
Adam Tuliper - MSFT
é por isso que eu uso o ETW, para registrar dados apenas se eu realmente precisar deles, não o tempo todo em um arquivo de log grande e feio.
magicandre1981
13

Em vez de usar um arquivo de log feio, você também pode ativar o log do Fusion via ETW / xperf ativando o provedor DotnetRuntime Private ( Microsoft-Windows-DotNETRuntimePrivate) com GUID 763FD754-7086-4DFE-95EB-C01A46FAF4CAe a FusionKeywordpalavra - chave (0x4).

@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

Quando você agora abre o arquivo ETL no PerfView e olha sob a tabela Eventos, pode encontrar os dados do Fusion:

Eventos de fusão no PerfView

magicandre1981
fonte
@YuriBondarchuk isso o ativa sob demanda e você tem mais dados no ETL (outros processos, dados de versão do arquivo) para poder fornecer aos arquivos t outros usuários e eles podem obter MUITO mais informação em comparação com o log de fusão normal
magicandre1981
12

Eu escrevi um visualizador de log de ligação de assembly chamado Fusion ++ e o coloquei no GitHub .

Você pode obter a versão mais recente daqui ou via chocolatey ( choco install fusionplusplus).

Espero que você e alguns dos visitantes aqui possam economizar alguns minutos dignos da vida com isso.

Fusion ++

Waescher
fonte
1
Caro senhor, você é um deus!
Sylvain Girard
1
Essa é uma ferramenta incrível, muito obrigado!
simoneL
3

Se você já possui o log ativado e ainda recebe esse erro no Windows 7 de 64 bits, tente isso no IIS 7.5:

  1. Crie um novo pool de aplicativos

  2. Vá para as configurações avançadas deste pool de aplicativos

  3. Defina Ativar aplicativo de 32 bits como True

  4. Aponte seu aplicativo Web para usar esse novo pool

Adam Mendoza
fonte
cara, você salva meu dia, levei cerca de 8 horas para resolver o problema. Muito Obrigado. :)
Dika Arta Karunia
3

Apenas um pouquinho de informação que pode ajudar outras pessoas; se você fizer algo parecido com a pesquisa de todos os assemblies em algum diretório por classes que herdam / implementam classes / interfaces, limpe os assemblies obsoletos se receber esse erro referente a um de seus próprios assemblies.

O cenário seria algo como:

  1. A montagem A carrega todas as montagens em alguma pasta
  2. O assembly B nesta pasta está obsoleto, mas faz referência ao assembly C
  3. O assembly C existe, mas os namespaces, nomes de classe ou algum outro detalhe podem ter mudado no tempo decorrido desde que o assembly B ficou obsoleto (no meu caso, um namespace foi alterado por meio de um processo de refatoração)

Em resumo: A --- cargas -> B (obsoleto) --- referências ---> C

Se isso acontecer, o único sinal indicativo é o espaço para nome e o nome da classe na mensagem de erro. Examine-o de perto. Se você não conseguir encontrá-lo em nenhum lugar da sua solução, provavelmente está tentando carregar um assembly obsoleto.

andrerav
fonte
3

Para quem é um pouco preguiçoso, recomendo executá-lo como um arquivo bat para sempre que você quiser ativá-lo:

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
Igor Meszaros
fonte
1

Apenas no caso de você estar se perguntando sobre a localização do FusionLog.exe - Você sabe que o possui, mas não o consegue encontrar? Eu procurava o FUSLOVW nos últimos anos várias vezes. Após a mudança para o .NET 4.5, o número da versão do FUSION LOG explodiu. Aqui estão os locais em que ele pode ser encontrado no disco, dependendo do software que você instalou:

C: \ Arquivos de programas (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 Tools \ x64

C: \ Arquivos de programas (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ x64

C: \ Arquivos de programas (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Tools \ x64

Ferramentas C: \ Arquivos de programas (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0

C: \ Arquivos de programas (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Tools

C: \ Arquivos de programas (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin

Dikshit Kathuria
fonte
0

No meu caso, ajudou a digitar o nome do disco em minúsculas

Errado - C: \ someFolder

Correto - c: \ someFolder

Vlad
fonte