So aktivieren Sie die Protokollierung von Assemblybindungsfehlern (Fusion) in .NET

818

Wie aktiviere ich die Protokollierung von Assemblybindungsfehlern (Fusion) in .NET?

user32736
quelle
46
Wenn es jemanden interessiert, lesen Sie diesen Artikel, um den Fusionslogger (fuslogvw.exe) zu verwenden: msdn.microsoft.com/en-us/library/e74a18c4(v=VS.100).aspx Hier erfahren Sie, wo Sie ihn und andere Informationen herunterladen können.
13
@ Will - danke fürs Teilen! Als Bonus - stellen Sie sicher, dass Sie fuslogvw.exeals Administrator ausgeführt werden, um Rechteprobleme zu vermeiden.
SliverNinja - MSFT
13
@ Will ich nicht zustimmen, dass die Installation von fuslogvw die "beste" Antwort ist. Wenn Sie nur das Tool erhalten könnten, ohne das gesamte Windows SDK in einer wahrscheinlich nicht entwicklungsorientierten Umgebung installieren zu müssen, hätten Sie einen Punkt.
Coxy
2
@ Will sicher, aber die Antwort, auf die Sie verlinken, deckt nichts davon ab.
Coxy
8
@ Will Bitte sei nicht so kindisch. Sie sind derjenige, der versucht, Repräsentanten zu sammeln, indem Sie eine Antwort bewerben, die zwar nützlich ist, von der Community jedoch als weniger hilfreich beurteilt wurde als andere, die viel einfacher und die andere praktisch gleich ist.
Coxy

Antworten:

868

Fügen Sie die folgenden Werte hinzu

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Fusion
Hinzufügen:
DWORD ForceLog setzt den Wert auf 1
DWORD LogFailures setzt den Wert auf 1
DWORD LogResourceBinds setzt den Wert auf 1
DWORD EnableLog setzt den Wert auf 1
String LogPath setzt den Wert für Protokolle auf Ordner (z. B. C: \ FusionLog \)

Stellen Sie sicher, dass Sie den Backslash nach dem Ordnernamen einfügen und dass der Ordner vorhanden ist .

Sie müssen das ausgeführte Programm neu starten, um das Lesen dieser Registrierungseinstellungen zu erzwingen.

Vergessen Sie übrigens nicht, die Fusionsprotokollierung zu deaktivieren, wenn sie nicht benötigt wird.

Geben Sie hier die Bildbeschreibung ein

Gary Kindel
quelle
23
Garys Lösungen funktionierten für mich, obwohl ich auch IIS zurücksetzen musste. Hinweis Ich habe dies in einer sauberen Umgebung konfiguriert, in der ich keine SDKs und dergleichen installieren wollte.
Michhes
5
Einige haben berichtet, dass eine Änderung der Registrierung nicht sofort erfolgt. Haben Sie versucht, die Fusion-Anmeldung zu aktivieren und dann neu zu starten?
Gary Kindel
54
Sie müssen das Programm, das Sie ausführen, neu starten, damit es diese Registrierungseinstellungen lesen kann
Orion Edwards
50
Der Fusion Log Viewer erledigt das alles für Sie. Gehen Sie zu Start -> Programme -> Visual Studio xxxx> Visual Studio-Tools> Visual Studio-Eingabeaufforderung (als Administrator ausführen) und geben Sie "fuslogvw" ein. In den Einstellungen passen Sie die Protokollierung an.
r3mark
10
Um die Protokollierung praktisch ein- und auszuschalten, habe ich .reg-Dateien erstellt, die auf Gary Kindels Antwort basieren: Aktivieren und Deaktivieren .
Igor Kustov
271

Normalerweise verwende ich den Fusion Log Viewer ( Fuslogvw.exe über eine Visual Studio-Eingabeaufforderung oder Fusion Log Viewer über das Startmenü). Mein Standard-Setup lautet:

  • Öffnen Sie Fusion Log Viewer als Administrator
  • Klicken Sie auf Einstellungen
  • Aktivieren Sie das Kontrollkästchen Benutzerdefinierten Protokollpfad aktivieren
  • Geben Sie den Speicherort ein, an den Protokolle geschrieben werden sollen, z. B. c:\FusionLogs( Wichtig: Stellen Sie sicher, dass Sie diesen Ordner tatsächlich im Dateisystem erstellt haben.)
  • Stellen Sie sicher, dass die richtige Protokollierungsstufe aktiviert ist (manchmal wähle ich einfach Alle Bindungen auf Festplatte protokollieren aus , um sicherzustellen, dass alles richtig funktioniert).
  • Klicken Sie auf OK
  • Setzen Sie die Option für den Protokollspeicherort auf Benutzerdefiniert

Denken Sie daran, die Abmeldung zu deaktivieren, wenn Sie fertig sind!

(Ich habe dies gerade zu einer ähnlichen Frage gepostet - ich denke, es ist auch hier relevant.)

Mike Goatly
quelle
4
Beachten Sie, dass Sie in Fällen, in denen Sie die Laufzeit selbst von einer nativen Anwendung aus hosten, aus irgendeinem Grund einen benutzerdefinierten Protokollpfad verwenden müssen, da sonst nichts protokolliert wird.
Jpierson
Zumindest in meiner Situation musste ich die benutzerdefinierten Protokollpfade nicht festlegen. Alles, was ich tun musste, war die Anmeldung zu aktivieren, z. B. "Alle Bindungen auf der Festplatte protokollieren" im Einstellungsdialog.
Josh
42
In meinem Fall war "Ausführen als Administrator" erforderlich, andernfalls wurden alle Optionen deaktiviert.
Vezenkov
2
Hinweis: Erstellen Sie den Ordner als Admin!
Tabrock
6
Stellen Sie sicher, dass Sie fuslogvwnicht nur als Administrator ausgeführt werden, sondern auch über den richtigen Windows SDK-Pfad, den das Visual Studio-Projekt verwendet, das die Ausnahme auslöst. Überprüfen Sie das csproj und suchen Sie nach SDK (mein SDK-Knoten heißt TargetFrameworkSDKToolsDirectory). Die Verwendung einer nicht passenden fuslogvw-Version scheint die Ausnahmen nicht zu erfassen (was Sinn macht ...)
Veverke
191

Wenn Sie das Windows SDK auf Ihrem Computer installiert haben, finden Sie den "Fusion Log Viewer" unter Microsoft SDK \ Tools (geben Sie einfach "Fusion" im Startmenü unter Vista oder Windows 7/8 ein). Starten Sie es, klicken Sie auf die Schaltfläche Einstellungen und wählen Sie "Protokollbindungsfehler" oder "Alle Bindungen protokollieren".

Wenn diese Schaltflächen deaktiviert sind, kehren Sie zum Startmenü zurück, klicken Sie mit der rechten Maustaste auf den Protokoll-Viewer und wählen Sie "Als Administrator ausführen".

Samuel Jack
quelle
6
Diese Schaltflächen sind für mich deaktiviert - warum?
Tim Lovell-Smith
14
@ Tim, vorher nicht gesehen - könnte es mit Administratorrechten zu tun haben? Es ist schließlich HKEY_LOCAL_MACHINE, das geändert wird.
Samuel Jack
2
"Einstellungen, Protokollbindungsfehler" war genug, um mein Problem zu finden.
Pauloya
1
Stellen Sie sicher, dass der Ordner Schreibzugriff zulässt. UAC und c: \ logs spielen nicht gut mit dem Fusionsprotokoll
Edward Wilde
4
Wenn die Schaltflächen deaktiviert sind, führen Sie den Fusionsprotokoll-Viewer mit Administratorrechten erneut aus.
Bruno Lopes
86

Legen Sie den folgenden Registrierungswert fest:

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

Zum Deaktivieren auf 0 setzen oder den Wert löschen.

[Bearbeiten]: Speichern Sie den folgenden Text in einer Datei, z. B. FusionEnableLog.reg, im Windows Registry Editor-Format:

Windows Registry Editor Version 5.00

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

Führen Sie dann die Datei im Windows Explorer aus und ignorieren Sie die Warnung vor möglichen Schäden.

user32736
quelle
4
Nicht, dass der Eintrag wahrscheinlich nicht existiert - Sie müssen ihn erstellen. Zumindest habe ich das getan, als ich diese Frage heute Morgen kurz vor dem Absturz beantworten wollte :)
Jon Skeet
3
Was macht das! bedeuten? Schlüssel oder Wert? Was ist mit 64-Bit-Systemen?
Bruno Martinez
48
Eigentlich funktioniert das ... Sie müssen nur iisreset afterwords ausführen, damit es funktioniert.
Nick DeMayo
4
@Norman: Da diese spezielle Einstellung verwendet wird, um die Asp.Net-Fehler dazu zu bringen, dass auf den Fehlerseiten Fehlermeldungen zur Baugruppenbindung angezeigt werden, werden die Protokolle nicht in einer Datei gespeichert. @OP: +1. Bearbeitet, um eine .reg-Datei einzuschließen. Das ! Das Format habe ich noch nie gesehen, außer in der Fehlermeldung, die mich auf diese Seite geschickt hat, um nach Antworten zu suchen.
Brian
2
Sie müssen IIS nicht zurücksetzen - nur den entsprechenden Anwendungspool. Zumindest war das alles, was ich tun musste.
Kenny Evitt
81

Sie können dieses Powershell-Skript als Administrator ausführen, um FL zu aktivieren:

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

und dieses zu deaktivieren:

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
quelle
4
Vielen Dank! Ich habe mir erlaubt, Ihre Befehle in dieses Wesentliche aufzunehmen . Und ich habe die Erstellung des c:\FusionLogVerzeichnisses hinzugefügt, damit die Leute das nicht vergessen ;-)
Oliver
Befehlszeilenregeln! Ich könnte dies schnell wiedergeben, indem ich die bisher am besten erfundene Code-Wiederverwendbarkeitstechnologie namens "Ausschneiden und Einfügen" verwende. Vielen Dank.
Remigijus Pankevičius
20

Das Änderungsskript des Fusion Log Settings Viewer ist nicht der beste Weg, dies zu tun.

In ASP.NET war es manchmal schwierig, dies richtig zum Laufen zu bringen. Dieses Skript funktioniert hervorragend und wurde auch in der Liste der Elektrowerkzeuge von Scott Hanselman aufgeführt . Ich persönlich habe es jahrelang benutzt und es hat mich nie im Stich gelassen.

Adam Tuliper - MSFT
quelle
ps Stellen Sie sicher, dass Sie es nach dem Ausführen deaktivieren oder dieser Ordner könnte ziemlich groß werden
Adam Tuliper - MSFT
Aus diesem Grund verwende ich ETW, um Daten nur dann zu protokollieren, wenn ich sie wirklich benötige, nicht immer in einer hässlichen großen Protokolldatei.
magicandre1981
13

Anstatt eine hässliche Protokolldatei zu verwenden, können Sie das Fusion-Protokoll auch über ETW / xperf aktivieren, indem Sie den DotnetRuntime Private Provider ( Microsoft-Windows-DotNETRuntimePrivate) mit aktivierter GUID 763FD754-7086-4DFE-95EB-C01A46FAF4CAund dem FusionKeywordSchlüsselwort (0x4) aktivieren.

@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

Wenn Sie jetzt die ETL-Datei in PerfView öffnen und in der Ereignistabelle nachsehen, finden Sie die Fusion-Daten:

Fusionsereignisse in PerfView

magicandre1981
quelle
@YuriBondarchuk dies aktiviert es bei Bedarf und Sie haben mehr Daten in der ETL (andere Prozesse, Dateiversionsdaten), so dass Sie die Dateien anderen Benutzern geben können und sie VIEL mehr Informationen im Vergleich zum normalen Fusionsprotokoll erhalten können
magicandre1981
12

Ich habe einen Assembly Binding Log Viewer namens Fusion ++ geschrieben und auf GitHub gestellt .

Sie können die neueste Version hier oder überocolatey ( choco install fusionplusplus) erhalten.

Ich hoffe, Sie und einige der Besucher hier können damit einige lebenslange Minuten sparen.

Fusion ++

Waescher
quelle
1
Sehr geehrter Herr, Sie sind ein Gott!
Sylvain Girard
1
Das ist ein erstaunliches Werkzeug, vielen Dank!
SimoneL
3

Wenn Sie die Protokollierung bereits aktiviert haben und dieser Fehler unter Windows 7 64-Bit weiterhin auftritt, versuchen Sie dies in IIS 7.5:

  1. Erstellen Sie einen neuen Anwendungspool

  2. Wechseln Sie zu den erweiterten Einstellungen dieses Anwendungspools

  3. Setzen Sie die Option 32-Bit-Anwendung aktivieren auf True

  4. Zeigen Sie mit Ihrer Webanwendung auf diesen neuen Pool

Adam Mendoza
quelle
Mann, du rettest meinen Tag, ich habe ungefähr 8 Stunden gebraucht, um das Problem zu lösen. Danke vielmals. :)
Dika Arta Karunia
3

Nur eine kleine Information, die anderen helfen könnte; Wenn Sie alle Assemblys in einem Verzeichnis nach Klassen durchsuchen, die Klassen / Schnittstellen erben / implementieren, müssen Sie veraltete Assemblys bereinigen, wenn dieser Fehler bei einer Ihrer eigenen Assemblys auftritt.

Das Szenario wäre ungefähr so:

  1. Baugruppe A lädt alle Baugruppen in einen Ordner
  2. Assembly B in diesem Ordner ist veraltet, verweist jedoch auf Assembly C.
  3. Assembly C ist vorhanden, aber Namespaces, Klassennamen oder andere Details haben sich möglicherweise in der Zeit geändert, die vergangen ist, seit Assembly B veraltet ist (in meinem Fall wurde ein Namespace durch einen Refactoring-Prozess geändert).

Kurzum: A --- lädt -> B (veraltet) --- Referenzen ---> C.

In diesem Fall ist das einzige verräterische Zeichen der Namespace und der Klassenname in der Fehlermeldung. Untersuche es genau. Wenn Sie es in Ihrer Lösung nirgendwo finden, versuchen Sie wahrscheinlich, eine veraltete Baugruppe zu laden.

andrerav
quelle
3

Für diejenigen, die etwas faul sind, empfehle ich, diese Datei als Bat-Datei auszuführen, wenn Sie sie aktivieren möchten:

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

Nur für den Fall, dass Sie sich über den Speicherort von FusionLog.exe wundern - Sie wissen, dass Sie ihn haben, aber Sie können ihn nicht finden? Ich habe in den letzten Jahren immer wieder nach FUSLOVW gesucht. Nach dem Wechsel zu .NET 4.5 ist die Anzahl der Versionen von FUSION LOG explodiert. Je nachdem, welche Software Sie installiert haben, befinden sich diese auf Ihrer Festplatte:

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

C: \ Programme (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ x64

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

C: \ Programme (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 Tools

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

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

Dikshit Kathuria
quelle
0

In meinem Fall hat geholfen, den Datenträgernamen in Kleinbuchstaben einzugeben

Falsch - C: \ someFolder

Richtig - c: \ someFolder

Vlad
quelle