Как включить ведение журнала ошибок привязки сборки (Fusion) в .NET

745

Как включить ведение журнала сбоев привязки сборки (Fusion) в .NET?

  • 43
    Если кому-то нужно, чтобы использовать fusion logger (fuslogvw.exe), прочитайте эту статью: msdn.microsoft.com/en-us/library/e74a18c4(v=VS.100).aspx , где вы можете скачать его и другую информацию.
  • 12
    @Will - спасибо, что поделились! В качестве бонуса - убедитесь, что вы запускаете fuslogvw.exe от имени администратора, чтобы избежать проблем с правами.
Показать ещё 7 комментариев
Теги:
binding
assemblies

11 ответов

813

Добавьте следующие значения в

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion
Add:
DWORD ForceLog set value to 1
DWORD LogFailures set value to 1
DWORD LogResourceBinds set value to 1
DWORD EnableLog set value to 1
String LogPath set value to folder for logs (e.g. C:\FusionLog\)

Убедитесь, что включить обратную косую черту после имени папки и Папка существует.

Вам необходимо перезапустить программу, которую вы используете, чтобы заставить ее прочитать эти параметры реестра.

BTW, не забудьте выключить слияние, если не нужно.

  • 20
    Решения Гэри работали для меня, хотя я также должен был выполнить сброс IIS. Обратите внимание, что я настроил это в чистой среде, где я не хотел устанавливать SDK и тому подобное.
  • 0
    Я добавил эти записи, но мой c # express (2010) все еще говорит мне: «Регистрация привязки сборки выключена». Как заставить это работать?
Показать ещё 13 комментариев
244

Я обычно использую Fusion Log Viewer (Fuslogvw.exe из командной строки Visual Studio или Fusion Log Viewer из меню "Пуск") - мои стандартные настройки:

  • Откройте Fusion Log Viewer от имени администратора
  • Нажмите настройки
  • Установите флажок Включить пользовательский путь к журналу
  • Введите местоположение, в которое вы хотите записывать журналы, например, c:\FusionLogs (Важно: убедитесь, что вы действительно создали эту папку в файловой системе.)
  • Убедитесь, что включен правильный уровень ведения журнала (иногда я просто выбираю " Журнал всех привязок к диску", чтобы убедиться, что все работает правильно)
  • Нажмите ОК
  • Установите опцию расположения журнала в Custom

Не забудьте выключить выход, как только вы закончите!

(Я только что опубликовал это на похожем вопросе - я думаю, что это актуально и здесь.)

  • 4
    Обратите внимание, что в тех случаях, когда вы сами размещаете среду выполнения из нативного приложения, вам по какой-то причине потребуется использовать собственный путь к журналу, иначе вы ничего не зарегистрируете.
  • 0
    По крайней мере, в моей ситуации мне не нужно было устанавливать собственные пути к журналам. Все, что мне нужно было сделать, это включить регистрацию, например, «Записать все привязки к диску» в диалоговом окне настроек.
Показать ещё 7 комментариев
192

Если на вашем компьютере установлен SDK Windows, вы найдете "Средство просмотра журнала Fusion" в Microsoft SDK\Tools (просто введите "Fusion" в меню "Пуск" в Vista или Windows 7/8). Запустите его, нажмите кнопку "Параметры" и выберите "Ошибка связывания журнала" или "Записать все привязки".

Если эти кнопки отключены, вернитесь в меню "Пуск", щелкните правой кнопкой мыши "Просмотр журнала" и выберите "Запуск от имени администратора".

  • 6
    Эти кнопки отключены для меня - почему?
  • 14
    @ Тим, не видел этого раньше - это может быть связано с правами администратора? Это HKEY_LOCAL_MACHINE, который изменяется в конце концов.
Показать ещё 5 комментариев
78

Задайте следующее значение реестра:

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

Чтобы отключить, установите значение 0 или удалите значение.

[edit]: Сохраните следующий текст в файле, например FusionEnableLog.reg, в Формат редактора реестра Windows:

Windows Registry Editor Version 5.00

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

Затем запустите файл из проводника Windows и проигнорируйте предупреждение о возможном повреждении.

  • 2
    Не то чтобы запись, вероятно, не существовала - вам придется ее создать. По крайней мере, я сделал это, когда собирался ответить на этот вопрос незадолго до крушения этим утром :)
  • 3
    Что это ! имею в виду? Ключ или значение? Как насчет 64-битных систем?
Показать ещё 7 комментариев
57

Вы можете запустить этот скрипт 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
  • 3
    Спасибо! Я позволил себе ввести ваши команды в эту суть . И я добавил создание директории c:\FusionLog чтобы люди не забыли об этом ;-)
  • 0
    Правила командной строки! Я мог бы быстро воспроизвести это, используя лучшую изобретенную до сих пор технологию повторного использования кода, называемую «вырезать и вставить». Благодарю.
19

Fusion Log Settings Viewer changer script не лучший способ сделать это.

В ASP.NET время от времени было сложно, чтобы это работало правильно. Этот script отлично работает и был включен в список Скотта Hanselman Power Tool. Я лично использовал его в течение многих лет, и это никогда не подводило меня.

  • 0
    ps УБЕДИТЕСЬ, что вы отключите его после запуска, иначе эта папка может стать достаточно большой
  • 0
    Вот почему я использую ETW, чтобы регистрировать данные, только если они мне действительно нужны, а не все время в уродливом большом файле журнала.
9

Вместо использования уродливого файла журнала вы также можете активировать журнал 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:

Изображение 1005

  • 0
    @YuriBondarchuk это активирует его по требованию, и у вас есть больше данных в ETL (другие процессы, данные файловой версии), так что вы можете передать файлы другим пользователям, и они могут получить НАМНОГО больше информации по сравнению с обычным журналом Fusion.
3

Просто крошечная информация, которая может помочь другим; если вы что-то делаете в поисках всех сборок в каком-то каталоге для классов, наследующих/реализующих классы/интерфейсы, тогда убедитесь, что вы очищаете устаревшие сборки, если вы получаете эту ошибку, относящуюся к одной из ваших собственных сборок.

Сценарий будет выглядеть примерно так:

  • Сборка A загружает все сборки в какой-либо папке
  • Сборка B в этой папке устарела, но ссылка на сборку C
  • Сборка C существует, но пространства имен, имена классов или некоторые другие детали могут измениться за время, прошедшее после того, как сборка B стала устаревшей (в моем случае пространство имен было изменено с помощью процесса рефакторинга)

Короче: A --- нагрузки → B (устаревшие) --- ссылки --- > C

Если это произойдет, единственным признаком соответствия является пространство имен и имя класса в сообщении об ошибке. Осмотрите его внимательно. Если вы не можете найти его в своем решении, вы, вероятно, попытаетесь загрузить устаревшую сборку.

2

Если вы уже включили ведение журнала и все еще получаете эту ошибку в 64-разрядной версии Windows 7, попробуйте это в IIS 7.5:

  • Создайте новый пул приложений

  • Перейдите к дополнительным настройкам пула приложений

  • Установите для параметра "Включить 32-разрядное приложение" значение "Истина"

  • Направьте ваше веб-приложение на использование этого нового пула

1

На всякий случай, если вам интересно узнать, где находится 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

0

В моем случае помогло ввести имя диска в нижнем регистре

Неправильно - C:\someFolder

Правильно - c:\someFolder

Ещё вопросы

Сообщество Overcoder
Наверх
Меню