Cómo habilitar el registro de fallas de enlace de ensamblaje (Fusion) en .NET

818

¿Cómo habilito el registro de fallas de enlace de ensamblaje (Fusion) en .NET?

usuario32736
fuente
46
Si a alguien le importa, para usar el registrador de fusión (fuslogvw.exe) lea este artículo: msdn.microsoft.com/en-us/library/e74a18c4(v=VS.100).aspx le indica dónde descargarlo y otra información.
13
@ Will - ¡gracias por compartir! Como beneficio adicional: asegúrese de ejecutarlo fuslogvw.execomo administrador para evitar problemas de derechos.
SliverNinja - MSFT
13
@ No estoy de acuerdo con que instalar fuslogvw sea la "mejor" respuesta. Si pudiera obtener solo la herramienta sin tener que instalar todo el SDK de Windows en lo que probablemente no sea un entorno de desarrollo, entonces tendría un punto.
Coxy
2
@ Sin duda, pero la respuesta a la que se vincula no cubre nada de eso.
Coxy
8
@ Will Por favor, no seas tan infantil al respecto. Usted es el que intenta reunir representantes promoviendo una respuesta que, si bien es útil, la comunidad ha considerado menos útil que otras, una que es mucho más fácil y otra que es prácticamente la misma.
Coxy

Respuestas:

868

Agregue los siguientes valores a

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Fusion
Añadir:
DWORD ForceLog establece el valor en 1
DWORD LogFailures establece el valor en 1
DWORD LogResourceBinds establece el valor en 1
DWORD EnableLog establece el valor en 1
String LogPath establece el valor en la carpeta para registros (por ejemplo, C: \ FusionLog \)

Asegúrese de incluir la barra diagonal inversa después del nombre de la carpeta y de que la carpeta existe .

Debe reiniciar el programa que está ejecutando para obligarlo a leer la configuración del registro.

Por cierto, no olvides desactivar el registro de fusión cuando no sea necesario.

ingrese la descripción de la imagen aquí

Gary Kindel
fuente
23
Las soluciones de Gary funcionaron para mí, aunque también tuve que seguir reiniciando IIS. Tenga en cuenta que configuré esto en un entorno limpio donde no quería instalar SDK y similares.
Michhes
55
Algunos han informado que el cambio en el registro no se lleva de inmediato. ¿Has intentado activar el inicio de sesión de Fusion y luego reiniciar?
Gary Kindel
54
Debe reiniciar cualquier programa que esté ejecutando para que pueda leer la configuración del registro
Orion Edwards
50
Fusion Log Viewer hace todo eso por usted. Vaya a Inicio -> Programas -> Visual Studio xxxx> Herramientas de Visual Studio> Símbolo del sistema de Visual Studio (ejecutar como administrador) y escriba "fuslogvw". En Configuración, ajusta el registro.
r3mark
10
Para activar / desactivar el registro a mano, he creado archivos .reg, que se basan en la respuesta de Gary Kindel: habilitar y deshabilitar .
Igor Kustov
271

Por lo general, uso Fusion Log Viewer ( Fuslogvw.exe desde un símbolo del sistema de Visual Studio o Fusion Log Viewer desde el menú de inicio). Mi configuración estándar es:

  • Abra Fusion Log Viewer como administrador
  • Haga clic en configuración
  • Marque la casilla de verificación Habilitar ruta de acceso de registro personalizada
  • Ingrese la ubicación en la que desea que se escriban los registros, por ejemplo, c:\FusionLogs( Importante: asegúrese de haber creado esta carpeta en el sistema de archivos).
  • Asegúrese de que el nivel correcto de registro esté activado (a veces solo selecciono Registrar todos los enlaces en el disco solo para asegurarme de que las cosas funcionen correctamente)
  • Haga clic en Aceptar
  • Establezca la opción de ubicación del registro en Personalizado

¡Recuerde desactivar el cierre de sesión una vez que haya terminado!

(Acabo de publicar esto en una pregunta similar, creo que también es relevante aquí).

Mike Goatly
fuente
44
Tenga en cuenta que en los casos en que hospede el tiempo de ejecución usted mismo desde una aplicación nativa, se le pedirá que use una ruta de registro personalizada por algún motivo, de lo contrario no obtendrá nada registrado.
jpierson
Al menos en mi situación, en realidad no tuve que establecer las rutas de registro personalizadas. Todo lo que tenía que hacer era activar el inicio de sesión, por ejemplo, "Registrar todos los enlaces al disco" en el cuadro de diálogo de configuración.
Josh
42
Ejecutar como administrador era obligatorio en mi caso, de lo contrario, todas las opciones estaban deshabilitadas.
vezenkov
2
Nota: ¡cree la carpeta como Admin!
Tabrock
66
Asegúrese de ejecutar fuslogvwno solo como administrador sino también desde la ruta correcta del SDK de Windows que está utilizando el proyecto de Visual Studio que arroja la excepción. Verifique su csproj y busque SDK dentro (mi nodo sdk se llama TargetFrameworkSDKToolsDirectory). El uso de una versión de fuslogvw no coincidente parece no detectar las excepciones (lo cual tiene sentido ...)
Veverke
191

Si tiene el SDK de Windows instalado en su máquina, encontrará el "Visor de registro de Fusion" en Microsoft SDK \ Tools (simplemente escriba "Fusion" en el menú de inicio en Vista o Windows 7/8). Ejecútelo, haga clic en el botón Configuración y seleccione "Registrar error de enlace" o "Registrar todos los enlaces".

Si estos botones están deshabilitados, regrese al menú de inicio, haga clic con el botón derecho en el Visor de registro y seleccione "Ejecutar como administrador".

Samuel Jack
fuente
66
Esos botones están desactivados para mí, ¿por qué?
Tim Lovell-Smith
14
@Tim, no lo había visto antes, ¿podría tener que ver con los privilegios de administrador? HKEY_LOCAL_MACHINE está siendo modificado después de todo.
Samuel Jack
2
"Configuración, errores de enlace de registro" fue suficiente para encontrar mi problema.
pauloya
1
Asegúrese de que la carpeta permita el acceso de escritura. UAC y c: \ logs no juegan bien con el registro de fusión
Edward Wilde
44
Como nota, si los botones están deshabilitados, vuelva a ejecutar el visor de registro de fusión con privilegios de administrador.
Bruno Lopes
86

Establezca el siguiente valor de registro:

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

Para deshabilitar, establezca en 0 o elimine el valor.

[editar]: guarde el siguiente texto en un archivo, por ejemplo, FusionEnableLog.reg, en el formato del Editor del Registro de Windows:

Windows Registry Editor Version 5.00

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

Luego ejecute el archivo desde el explorador de Windows e ignore la advertencia sobre posibles daños.

usuario32736
fuente
44
No es que la entrada probablemente no exista; tendrá que crearla. Al menos, lo hice cuando estaba a punto de responder esta pregunta justo antes del accidente esta mañana :)
Jon Skeet
3
Lo que hace el ! ¿media? Clave o valor? ¿Qué pasa con los sistemas de 64 bits?
Bruno Martinez
48
en realidad, esto funciona ... solo necesita ejecutar iisreset afterwords para que funcione.
Nick DeMayo
44
@ Norman: Debido a que esta configuración particular se usa para hacer que los errores de Asp.Net muestren mensajes de error de enlace de ensamblaje en las páginas de error, no para guardar los registros en el archivo. @OP: +1. Editado para incluir un archivo .reg. Los ! El formato es uno que nunca había visto, excepto en el mensaje de error que me envió a esta página en busca de respuestas.
Brian
2
No necesita restablecer IIS, solo el grupo de aplicaciones relevante. O al menos eso era todo lo que necesitaba hacer.
Kenny Evitt
81

Puede ejecutar este script de Powershell como administrador para habilitar 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

y este para deshabilitar:

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
fuente
44
¡Gracias! Me permití poner tus órdenes en esta esencia . Y agregué la creación del c:\FusionLogdirectorio para que la gente no lo olvide ;-)
Oliver
Reglas de línea de comando! Podría reproducir esto rápidamente utilizando la tecnología de reutilización de código mejor inventada hasta ahora llamada "cortar y pegar". Gracias.
Remigijus Pankevičius
20

El script del cambiador del Visor de configuración de registro de Fusion no es la mejor manera de hacerlo.

En ASP.NET , a veces ha sido complicado hacer que esto funcione correctamente. Este script funciona muy bien y también figura en la lista de herramientas de Scott Hanselman . Lo he usado personalmente durante años y nunca me ha decepcionado.

Adam Tuliper - MSFT
fuente
ps ASEGÚRESE de deshabilitarlo después de ejecutarlo o esta carpeta podría ser bastante grande
Adam Tuliper - MSFT
Es por eso que uso ETW, solo para registrar datos si realmente los necesito, no todo el tiempo en un archivo de registro feo y grande.
magicandre1981
13

En lugar de utilizar un archivo de registro feo, también puede activar el registro de Fusion a través de ETW / xperf activando el proveedor privado DotnetRuntime ( Microsoft-Windows-DotNETRuntimePrivate) con GUID 763FD754-7086-4DFE-95EB-C01A46FAF4CAy la FusionKeywordpalabra clave (0x4) activada.

@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

Cuando abre el archivo ETL en PerfView y mira debajo de la tabla Eventos, puede encontrar los datos de Fusion:

Eventos de fusión en PerfView

magicandre1981
fuente
@YuriBondarchuk esto lo activa bajo demanda y tiene más datos en el ETL (otros procesos, datos de conversión de archivos) para que pueda proporcionar los archivos a otros usuarios y puedan obtener MUCHA más información en comparación con el registro de fusión normal
magicandre1981
12

Escribí un visor de registro de enlace de ensamblaje llamado Fusion ++ y lo puse en GitHub .

Puede obtener la última versión desde aquí o mediante chocolatey ( choco install fusionplusplus).

Espero que usted y algunos de los visitantes aquí puedan ahorrar algunos valiosos minutos de por vida.

Fusion ++

Waescher
fuente
1
Estimado señor, usted es un dios!
Sylvain Girard
1
Esa es una herramienta increíble, ¡muchas gracias!
simoneL
3

Si ya tiene habilitado el registro y aún recibe este error en Windows 7 de 64 bits, intente esto en IIS 7.5:

  1. Crear un nuevo grupo de aplicaciones

  2. Vaya a la Configuración avanzada de este grupo de aplicaciones

  3. Establezca Habilitar aplicación de 32 bits en Verdadero

  4. Apunte su aplicación web para usar este nuevo grupo

Adam Mendoza
fuente
hombre, me salvas el día, me tomó alrededor de 8 horas resolver el problema. muchas gracias. :)
Dika Arta Karunia
3

Solo un poquito de información que podría ayudar a otros; si hace algo en la línea de buscar en todos los ensamblados en algún directorio las clases que heredan / implementan clases / interfaces, entonces asegúrese de limpiar los ensambles obsoletos si obtiene este error relacionado con uno de sus propios ensamblajes.

El escenario sería algo como:

  1. El conjunto A carga todos los conjuntos en alguna carpeta
  2. El ensamblado B en esta carpeta está obsoleto, pero hace referencia al ensamblado C
  3. El ensamblado C existe, pero los espacios de nombres, los nombres de clase o algún otro detalle podrían haber cambiado en el tiempo transcurrido desde que el ensamblaje B quedó obsoleto (en mi caso, un espacio de nombres se modificó mediante un proceso de refactorización)

En resumen: A --- cargas -> B (rancio) --- referencias ---> C

Si esto sucede, el único signo revelador es el espacio de nombres y el nombre de clase en el mensaje de error. Examínelo de cerca. Si no puede encontrarlo en ninguna parte de su solución, es probable que esté intentando cargar un conjunto obsoleto.

andrerav
fuente
3

Para aquellos que son un poco vagos, les recomiendo ejecutar esto como un archivo bat para cuando quieran habilitarlo:

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
fuente
1

En caso de que se pregunte sobre la ubicación de FusionLog.exe: ¿sabe que lo tiene, pero no puede encontrarlo? Estaba buscando FUSLOVW en los últimos años una y otra vez. Después de pasar a .NET 4.5, el número de versión de FUSION LOG ha explotado. Hay lugares donde se puede encontrar en su disco, dependiendo del software que haya instalado:

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

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

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

C: \ Archivos de programa (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 Herramientas

C: \ Archivos de programa (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Herramientas

C: \ Archivos de programa (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin

Dikshit Kathuria
fuente
0

En mi caso ayudó a escribir el nombre del disco en minúsculas

Incorrecto - C: \ someFolder

Correcto - c: \ someFolder

Vlad
fuente