Comment activer la journalisation des échecs de liaison d'assembly (Fusion) dans .NET

818

Comment activer la journalisation des échecs de liaison d'assembly (Fusion) dans .NET?

user32736
la source
46
Si quelqu'un s'en soucie, pour utiliser l'enregistreur de fusion (fuslogvw.exe), lisez cet article: msdn.microsoft.com/en-us/library/e74a18c4(v=VS.100).aspx, il vous indique où le télécharger et d'autres informations.
13
@Will - merci pour le partage! En prime - assurez-vous que vous exécutez fuslogvw.exeen tant qu'administrateur pour éviter tout problème de droits.
SliverNinja - MSFT
13
@Je ne suis pas d'accord pour dire que l'installation de fuslogvw est la "meilleure" réponse. Si vous pouviez obtenir juste l'outil sans avoir à installer l'intégralité du SDK Windows sur ce qui n'est probablement pas un environnement de développement, alors vous auriez raison.
Coxy
2
@Will Certainement, mais la réponse à laquelle vous liez ne couvre rien de tout cela.
Coxy
8
@S'il vous plaît, ne soyez pas si enfantin à ce sujet. Vous êtes celui qui essaie de rassembler des représentants en promouvant une réponse que, bien qu'utile, la communauté a jugé moins utile que les autres, une qui est beaucoup plus facile et une autre qui est pratiquement la même.
Coxy

Réponses:

868

Ajoutez les valeurs suivantes à

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Fusion
Ajouter:
DWORD ForceLog définit la valeur sur 1
DWORD LogFailures définit la valeur sur 1
DWORD LogResourceBinds définit la valeur sur 1
DWORD EnableLog définit la valeur sur 1
String LogPath définit la valeur du dossier pour les journaux (par exemple C: \ FusionLog \)

Assurez-vous d' inclure la barre oblique inverse après le nom du dossier et que le dossier existe .

Vous devez redémarrer le programme que vous exécutez pour le forcer à lire ces paramètres de registre.

Au fait, n'oubliez pas de désactiver la journalisation de fusion lorsque vous n'en avez pas besoin.

entrez la description de l'image ici

Gary Kindel
la source
23
Les solutions de Gary ont fonctionné pour moi, même si j'ai également dû suivre en réinitialisant IIS. Remarque J'ai configuré ceci dans un environnement propre où je ne voulais pas installer de SDK et autres.
Michhes
5
Certains ont signalé que le changement de registre ne prend pas immédiatement. Avez-vous essayé d'activer la connexion Fusion puis de redémarrer?
Gary Kindel
54
Vous devez redémarrer le programme que vous exécutez pour qu'il puisse lire ces paramètres de registre
Orion Edwards
50
Fusion Viewer fait tout cela pour vous. Allez dans Démarrer -> Programmes -> Visual Studio xxxx> Outils Visual Studio> Invite de commandes Visual Studio (exécuté en tant qu'administrateur) et tapez "fuslogvw". Dans Paramètres, vous ajustez la journalisation.
r3mark
10
Pour activer / désactiver la journalisation, j'ai créé des fichiers .reg, qui sont basés sur la réponse de Gary Kindel: activer et désactiver .
Igor Kustov
271

J'utilise généralement Fusion Log Viewer ( Fuslogvw.exe à partir d'une invite de commande Visual Studio ou Fusion Log Viewer dans le menu Démarrer) - ma configuration standard est la suivante:

  • Ouvrez Fusion Log Viewer en tant qu'administrateur
  • Cliquez sur paramètres
  • Vérifiez le chemin du journal personnalisée Activer case
  • Entrez l'emplacement où vous souhaitez que les journaux soient écrits, par exemple c:\FusionLogs( Important: assurez-vous que vous avez bien créé ce dossier dans le système de fichiers.)
  • Assurez-vous que le bon niveau de journalisation est activé (je sélectionne parfois simplement Enregistrer toutes les liaisons sur le disque juste pour m'assurer que les choses fonctionnent bien)
  • Cliquez OK
  • Définissez l'option d'emplacement du journal sur Personnalisé

N'oubliez pas de fermer la session une fois que vous avez terminé!

(Je viens de poster ceci sur une question similaire - je pense que c'est pertinent ici aussi.)

Mike Goatly
la source
4
Notez que dans les cas où vous hébergez le runtime vous-même à partir d'une application native, vous devrez utiliser un chemin de journal personnalisé pour une raison quelconque, sinon vous n'aurez rien enregistré.
jpierson
Au moins dans ma situation, je n'avais pas vraiment besoin de définir les chemins de journal personnalisés. Tout ce que j'avais à faire était d'activer la connexion, par exemple, "Enregistrer toutes les liaisons sur le disque" dans la boîte de dialogue des paramètres.
Josh
42
Exécuter en tant qu'administrateur était requis dans mon cas, sinon toutes les options ont été désactivées.
vezenkov
2
Remarque: créez le dossier en tant qu'Admin!
Tabrock
6
Assurez-vous que vous exécutez fuslogvwnon seulement en tant qu'administrateur, mais également à partir du chemin Windows SDK correct que le projet Visual Studio lançant l'exception utilise. Vérifiez son csproj et recherchez SDK dans (mon nœud sdk est nommé TargetFrameworkSDKToolsDirectory). L'utilisation d'une version de fuslogvw non correspondante ne semble pas intercepter les exceptions (ce qui est logique ...)
Veverke
191

Si le SDK Windows est installé sur votre machine, vous trouverez le "Fusion Log Viewer" sous Microsoft SDK \ Tools (tapez simplement "Fusion" dans le menu Démarrer sur Vista ou Windows 7/8). Lancez-le, cliquez sur le bouton Paramètres et sélectionnez "Échec de la liaison de journal" ou "Enregistrer toutes les liaisons".

Si ces boutons sont désactivés, revenez au menu Démarrer, cliquez avec le bouton droit sur la visionneuse de journaux et sélectionnez «Exécuter en tant qu'administrateur».

Samuel Jack
la source
6
Ces boutons sont désactivés pour moi - pourquoi?
Tim Lovell-Smith
14
@Tim, pas vu auparavant - cela pourrait-il être lié aux privilèges d'administrateur? C'est HKEY_LOCAL_MACHINE qui est modifié après tout.
Samuel Jack
2
"Paramètres, échecs de liaison de journal" était suffisant pour trouver mon problème.
pauloya
1
Assurez-vous que le dossier autorise l'accès en écriture. UAC et c: \ logs ne jouent pas bien avec le journal de fusion
Edward Wilde
4
Tout comme une note, si les boutons sont désactivés, réexécutez la visionneuse du journal de fusion avec les privilèges d'administrateur.
Bruno Lopes
86

Définissez la valeur de registre suivante:

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

Pour désactiver, définissez sur 0 ou supprimez la valeur.

[modifier]: Enregistrez le texte suivant dans un fichier, par exemple FusionEnableLog.reg, au format de l'éditeur de registre Windows:

Windows Registry Editor Version 5.00

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

Exécutez ensuite le fichier à partir de l'explorateur Windows et ignorez l'avertissement concernant les dommages possibles.

user32736
la source
4
Non pas que l'entrée n'existera probablement pas - vous devrez la créer. Au moins, je l'ai fait quand j'étais sur le point de répondre à cette question juste avant le crash ce matin :)
Jon Skeet
3
Que fait le ! signifier? Clé ou valeur? Qu'en est-il des systèmes 64 bits?
Bruno Martinez
48
en fait, cela fonctionne ... il vous suffit d'exécuter les mots de passe iisreset pour le faire fonctionner.
Nick DeMayo
4
@Norman: car ce paramètre particulier est utilisé pour que les erreurs Asp.Net affichent des messages d'erreur de liaison d'assembly dans les pages d'erreur, et non pour enregistrer les journaux dans un fichier. @OP: +1. Modifié pour inclure un fichier .reg. Le ! le format est celui que je n'avais jamais vu, sauf dans le message d'erreur qui m'a envoyé sur cette page à la recherche de réponses.
Brian
2
Vous n'avez pas besoin de réinitialiser IIS - uniquement le pool d'applications correspondant. Ou du moins, c'était tout ce que j'avais à faire.
Kenny Evitt
81

Vous pouvez exécuter ce script Powershell en tant qu'administrateur pour activer 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

et celui-ci pour désactiver:

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
la source
4
Merci! Je me suis permis de mettre vos commandes dans ce sens . Et j'ai ajouté la création du c:\FusionLogdir pour que les gens ne l'oublient pas ;-)
Oliver
Règles de ligne de commande! Je pourrais rapidement rejouer cela en utilisant la technologie de réutilisation de code la plus inventée à ce jour, appelée "couper-coller". Merci.
Remigijus Pankevičius
20

Le script du changeur Fusion Log Settings Viewer n'est pas le meilleur moyen de le faire.

Dans ASP.NET , il a parfois été difficile de faire en sorte que cela fonctionne correctement. Ce script fonctionne très bien et figurait également sur la liste des outils électriques de Scott Hanselman . Je l'ai personnellement utilisé pendant des années et ça ne m'a jamais déçu.

Adam Tuliper - MSFT
la source
PS ASSUREZ-VOUS de le
c'est pourquoi j'utilise ETW, pour enregistrer les données uniquement si j'en ai vraiment besoin, pas tout le temps dans un gros fichier journal laid.
magicandre1981
13

Au lieu d'utiliser un fichier journal laid, vous pouvez également activer le journal Fusion via ETW / xperf en activant le fournisseur privé DotnetRuntime ( Microsoft-Windows-DotNETRuntimePrivate) avec GUID 763FD754-7086-4DFE-95EB-C01A46FAF4CAet le FusionKeywordmot clé (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

Lorsque vous ouvrez maintenant le fichier ETL dans PerfView et regardez sous le tableau des événements, vous pouvez trouver les données Fusion:

Événements de fusion dans PerfView

magicandre1981
la source
@YuriBondarchuk, il est activé à la demande et vous avez plus de données dans l'ETL (autres processus, données de version de fichier) afin que vous puissiez donner les fichiers aux autres utilisateurs et qu'ils puissent obtenir BEAUCOUP plus d'informations par rapport au journal de fusion normal
magicandre1981
12

J'ai écrit une visionneuse de journaux de liaison d'assemblage nommée Fusion ++ et l' ai mise sur GitHub .

Vous pouvez obtenir la dernière version d' ici ou via chocolatey ( choco install fusionplusplus).

J'espère que vous et certains des visiteurs ici pourrez économiser quelques minutes à vie avec.

Fusion ++

Waescher
la source
1
Cher monsieur, vous êtes un dieu!
Sylvain Girard
1
C'est un outil incroyable, merci beaucoup!
simoneL
3

Si la journalisation est déjà activée et que vous obtenez toujours cette erreur sur Windows 7 64 bits, essayez ceci dans IIS 7.5:

  1. Créer un nouveau pool d'applications

  2. Accédez aux paramètres avancés de ce pool d'applications

  3. Définissez l' option Activer l'application 32 bits sur True

  4. Pointez votre application Web pour utiliser ce nouveau pool

Adam Mendoza
la source
l'homme, vous sauvez ma journée, j'ai pris environ 8 heures pour résoudre le problème. Merci beaucoup. :)
Dika Arta Karunia
3

Juste un tout petit peu d'informations qui pourraient aider les autres; si vous faites quelque chose dans le sens de rechercher dans tous les assemblys d'un répertoire des classes qui héritent / implémentent des classes / interfaces, assurez-vous de nettoyer les assemblages périmés si vous obtenez cette erreur se rapportant à l'un de vos propres assemblys.

Le scénario serait quelque chose comme:

  1. L'assemblage A charge tous les assemblages dans un dossier
  2. L'assembly B dans ce dossier est périmé, mais fait référence à l'assembly C
  3. L'assembly C existe, mais les espaces de noms, les noms de classe ou d'autres détails peuvent avoir changé dans le temps qui s'est écoulé depuis que l'assembly B est devenu obsolète (dans mon cas, un espace de noms a été modifié via un processus de refactoring)

En bref: A --- charges -> B (périmé) --- références ---> C

Si cela se produit, le seul signe révélateur est l'espace de noms et le nom de classe dans le message d'erreur. Examinez-le attentivement. Si vous ne le trouvez nulle part dans votre solution, vous essayez probablement de charger un assemblage périmé.

andrerav
la source
3

Pour ceux qui sont un peu paresseux, je recommande de l'exécuter en tant que fichier bat pour chaque fois que vous souhaitez l'activer:

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
la source
1

Juste au cas où vous vous posez la question sur l'emplacement de FusionLog.exe - Vous savez que vous l'avez, mais vous ne le trouvez pas? Je cherchais FUSLOVW ces dernières années encore et encore. Après le passage à .NET 4.5, le nombre de versions de FUSION LOG a explosé. Ce sont des endroits où il peut être trouvé sur votre disque, selon le logiciel que vous avez installé:

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

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

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

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

Dikshit Kathuria
la source
0

Dans mon cas, j'ai aidé à taper le nom du disque en minuscules

Mauvais - C: \ someFolder

Correct - c: \ someFolder

Vlad
la source