Как включить ведение журнала ошибок привязки сборки (Fusion) в.NET
Как включить ведение журнала ошибок привязки сборки (Fusion) в.NET?
14 ответов
Добавьте следующие значения в
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion Добавлять: DWORD ForceLog установить значение 1 DWORD LogFailures установить значение 1 DWORD LogResourceBinds установить значение 1 DWORD EnableLog установить значение 1 String LogPath устанавливает значение в папку для журналов (например, C:\FusionLog\)
Убедитесь, что вы указали обратную косую черту после имени папки и что папка существует.
Вам нужно перезапустить программу, которую вы запускаете, чтобы заставить ее читать эти параметры реестра.
Кстати, не забудьте отключить Fusion Logging, когда это не нужно.
Я обычно использую Fusion Log Viewer ( Fuslogvw.exe из командной строки Visual Studio или Fusion Log Viewer из меню "Пуск") - мои стандартные настройки:
- Откройте Fusion Log Viewer от имени администратора
- Нажмите настройки
- Установите флажок Включить пользовательский путь к журналу
- Введите местоположение, в которое вы хотите записывать логи, например,
c:\FusionLogs
(Важно: убедитесь, что вы действительно создали эту папку в файловой системе.) - Убедитесь, что включен правильный уровень ведения журнала (иногда я просто выбираю " Журнал всех привязок к диску", чтобы убедиться, что все работает правильно)
- Нажмите ОК
- Установите опцию расположения журнала в Custom
Не забудьте выключить выход, как только вы закончите!
(Я только что опубликовал это на похожем вопросе - я думаю, что это актуально и здесь.)
Если на вашем компьютере установлен Windows SDK, вы найдете "Fusion Log Viewer" в Microsoft SDK\Tools (просто введите "Fusion" в меню "Пуск" в Vista или Windows 7/8). Запустите его, нажмите кнопку "Настройки" и выберите "Журнал сбоя привязки" или "Записать все привязки".
Если эти кнопки отключены, вернитесь в меню "Пуск", щелкните правой кнопкой мыши Log Viewer и выберите "Запуск от имени администратора".
Вы можете запустить этот скрипт 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
Примечание. Убедитесь, что каталог, указанный для записи LogPath, существует. Если каталог не существует, то ваши журналы не будут доступны для поиска.
и этот отключить:
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
Установите следующее значение реестра:
[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Fusion! EnableLog] (DWORD) в 1
Чтобы отключить, установите 0 или удалите значение.
[править]: сохраните следующий текст в файл, например, FusionEnableLog.reg, в формате редактора реестра Windows:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion]
"EnableLog"=dword:00000001
Затем запустите файл из проводника Windows и проигнорируйте предупреждение о возможном повреждении.
Я написал программу просмотра журнала привязки сборки под названием Fusion++ и разместил ее на GitHub.
Вы можете получить последнюю версию здесь или через шоколадный (choco install fusionplusplus
).
Я надеюсь, что вы и некоторые из присутствующих здесь посетителей сможете сэкономить с его помощью несколько достойных минут жизни.
Сценарий смены Fusion Log Settings Viewer - не лучший способ сделать это.
В ASP.NET иногда было сложно заставить это работать правильно. Этот скрипт прекрасно работает и был включен в список Power Tool Скотта Хансельмана. Я лично использовал это в течение многих лет, и это никогда не подводило меня.
Вместо использования некрасивого файла журнала вы также можете активировать журнал Fusion через ETW/xperf, включив частный провайдер DotnetRuntime (Microsoft-Windows-DotNETRuntimePrivate
) с GUID 763FD754-7086-4DFE-95EB-C01A46FAF4CA
и FusionKeyword
ключевое слово (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
Теперь, когда вы открываете файл ETL в PerfView и просматриваете таблицу "События", вы можете найти данные Fusion:
Для тех, кто немного ленив, я рекомендую запускать это как bat-файл, когда вы когда-нибудь захотите его включить:
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
Это не ответ, а предупреждение:
- Если вы когда-нибудь включите это ведение журнала, НЕ ЗАБУДЬТЕ ЕГО ОТКЛЮЧИТЬ , иначе вы пожалеете об этом позже.
Я забыл, и в итоге у меня осталось несколько ГБ небольших лог-файлов с
Количество файлов превышало 3 миллиона, и ни Total Commander, ни Windows Explorer не могли без зависаний отображать содержимое или размер папки.
После отключения ведения журнала и перезагрузки на всякий случай я запустил удаление из командной строки.
Потребовалось более 15 минут, чтобы удалить все файлы на твердотельном накопителе Samsung 970 Pro, который все время показывал 100%-ное использование диска — моя высокопроизводительная рабочая станция на ПК была поставлена на колени этой операцией удаления и оставалась частично отвечающей до тех пор, пока это закончилось.
Небольшая информация, которая может помочь другим; если вы делаете что-то вроде поиска всех сборок в некотором каталоге для классов, которые наследуют / реализуют классы / интерфейсы, то убедитесь, что вы очищаете устаревшие сборки, если вы получаете эту ошибку, относящуюся к одной из ваших собственных сборок.
Сценарий будет что-то вроде:
- Сборка А загружает все сборки в какую-то папку
- Сборка B в этой папке устарела, но ссылки на сборку C
- Сборка C существует, но пространства имен, имена классов или некоторые другие детали могли бы измениться за время, прошедшее с тех пор, как сборка B стала устаревшей (в моем случае пространство имен было изменено посредством процесса рефакторинга)
Короче говоря: A --- нагрузки -> B (устаревшие) --- ссылки ---> C
Если это происходит, единственным сигнальным знаком является пространство имен и имя класса в сообщении об ошибке. Изучите это внимательно. Если вы не можете найти его в своем решении, скорее всего, вы пытаетесь загрузить устаревшую сборку.
На всякий случай, если вам интересно узнать, где находится FusionLog.exe - вы знаете, что он у вас есть, но вы не можете его найти? Я искал FUSLOVW в последние несколько лет снова и снова. После перехода на.NET 4.5 номер версии FUSION LOG взорвался. Это места, где он может быть найден на вашем диске, в зависимости от установленного вами программного обеспечения:
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
C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ NETFX 4.0 Tools
C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Инструменты
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin
Если у вас уже включено ведение журнала и все еще появляется эта ошибка в 64-разрядной версии Windows 7, попробуйте это в IIS 7.5:
Создать новый пул приложений
Перейдите в Дополнительные настройки этого пула приложений.
Установите для параметра Включить 32-разрядное приложение значение True
Укажите ваше веб-приложение, чтобы использовать этот новый пул
В моем случае помогло ввести имя диска в нижнем регистре
Неправильно - C:\someFolder
Правильно - c:\someFolder