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


818

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


46
Если кому-то нужно, чтобы использовать fusion logger (fuslogvw.exe), прочитайте эту статью: msdn.microsoft.com/en-us/library/e74a18c4(v=VS.100).aspx , где вы можете скачать его и другую информацию.

13
@Will - спасибо, что поделились! В качестве бонуса - убедитесь, что вы работаете fuslogvw.exeот имени администратора, чтобы избежать каких-либо проблем с правами.
SliverNinja - MSFT

13
@ Я не согласен с тем, что установка fuslogvw - «лучший» ответ. Если бы вы могли получить только инструмент без установки всего пакета Windows SDK в среде, которая, вероятно, не является средой разработки, у вас был бы смысл.
Кокси

2
@ Конечно, но ответ, на который вы ссылаетесь, не охватывает ничего из этого.
Кокси

8
@ Будь добр, не будь таким ребяческим. Вы - один из тех, кто пытается собрать представителя, предлагая ответ, который, хотя и полезен, сообщество оценило как менее полезный, чем другие, один из которых намного проще, а другой практически такой же.
Кокси

Ответы:


868

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

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Fusion
Добавить:
DWORD ForceLog установить значение 1
DWORD LogFailures установить значение 1
DWORD LogResourceBinds установить значение 1
DWORD EnableLog установить значение 1
String LogPath устанавливает значение в папку для журналов (например, C: \ FusionLog \)

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

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

Кстати, не забудьте отключить регистрацию Fusion, когда она не нужна.

введите описание изображения здесь


23
Решения Гэри работали для меня, хотя я также должен был выполнить сброс IIS. Обратите внимание, что я настроил это в чистой среде, где я не хотел устанавливать SDK и тому подобное.
Мишес

5
Некоторые сообщили, что изменение реестра не сразу. Вы пытались включить регистрацию Fusion и перезагрузить компьютер?
Гари Киндель

54
Вам нужно перезапустить любую программу, которую вы используете, чтобы она прочитала эти настройки реестра
Orion Edwards,

50
Fusion Log Viewer сделает все это за вас. Перейдите в Пуск -> Программы -> Visual Studio xxxx> Инструменты Visual Studio> Командная строка Visual Studio (запускается от имени администратора) и введите «fuslogvw». В настройках вы настраиваете логирование.
r3mark

10
Чтобы включить / выключить ведение журналов, я создал файлы .reg, основанные на ответе Гари Кинделя: включение и отключение .
Игорь Кустов

271

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

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

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

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


4
Обратите внимание, что в тех случаях, когда вы сами размещаете среду выполнения из нативного приложения, вам по какой-то причине потребуется использовать собственный путь к журналу, иначе вы ничего не зарегистрируете.
jpierson

По крайней мере, в моей ситуации мне не нужно было устанавливать собственные пути к журналам. Все, что мне нужно было сделать, это включить регистрацию, например, «Записать все привязки к диску» в диалоговом окне настроек.
Джош

42
Запуск от имени администратора требовался в моем случае, иначе все параметры были отключены.
Везенков

2
Примечание: создайте папку с правами администратора!
Таброк

6
Убедитесь, что вы работаете fuslogvwне только как администратор, но и из правильного пути Windows SDK, который использует проект Visual Studio, выбрасывающий исключение. Проверьте его csproj и найдите SDK внутри (мой узел sdk назван TargetFrameworkSDKToolsDirectory). Использование несоответствующей версии fuslogvw, похоже, не улавливает исключения (что имеет смысл ...)
Veverke

191

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

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


6
Эти кнопки отключены для меня - почему?
Тим Ловелл-Смит

14
@ Тим, не видел этого раньше - это может быть связано с привилегиями администратора? Это HKEY_LOCAL_MACHINE, который изменяется в конце концов.
Сэмюэль Джек

2
«Настройки, ошибки привязки журнала» было достаточно, чтобы найти мою проблему.
pauloya

1
Убедитесь, что папка разрешает запись. Журналы UAC и c: \ не очень хорошо сочетаются с журналом Fusion
Эдвард Уайльд,

4
Как примечание, если кнопки отключены, перезапустите программу просмотра журнала Fusion с правами администратора.
Бруно Лопес

86

Установите следующее значение реестра:

[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 и проигнорируйте предупреждение о возможном повреждении.


4
Не то чтобы запись, вероятно, не существовала - вам придется ее создать. По крайней мере, я сделал это, когда собирался ответить на этот вопрос незадолго до крушения этим утром :)
Джон Скит

3
Что это ! жадный? Ключ или значение? Как насчет 64-битных систем?
Бруно Мартинес

48
на самом деле, это работает ... вам просто нужно запустить iisreset afterwords, чтобы заставить его работать.
Ник Демайо

4
@ Норман: Поскольку этот конкретный параметр используется для того, чтобы ошибки Asp.Net отображали сообщения об ошибках привязки сборки на страницах ошибок, а не для сохранения журналов в файл. @OP: +1. Отредактировано, чтобы включить файл .reg. ! Я не видел ни одного формата, кроме сообщения об ошибке, которое отправило меня на эту страницу в поисках ответов.
Брайан

2
Вам не нужно сбрасывать IIS - только соответствующий пул приложений. Или, по крайней мере, это было все, что мне нужно было сделать.
Кенни Эвитт

81

Вы можете запустить этот скрипт 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
mkdir C:\FusionLog -Force

и этот отключить:

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

4
Спасибо! Я позволил себе ввести ваши команды в эту суть . И я добавил создание c:\FusionLogdir, чтобы люди не забыли об этом ;-)
Оливер

Правила командной строки! Я мог бы быстро воспроизвести это, используя лучшую на сегодняшний день технологию повторного использования кода, называемую «вырезать и вставить». Спасибо.
Ремигиюс Панкявичюс

20

Чейнджера сценарий Fusion Log Settings просмотра это не ни один бар лучший способ сделать это.

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


ps УБЕДИТЕСЬ, что вы отключите его после запуска, иначе эта папка может стать достаточно большой
Адам Тулипер - MSFT

Вот почему я использую ETW, чтобы регистрировать данные, только если они мне действительно нужны, а не все время в уродливом большом файле журнала.
magicandre1981

13

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

Fusion события в PerfView


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

12

Я написал программу просмотра журнала привязки сборки под названием Fusion ++ и поместил ее на GitHub .

Вы можете получить последнюю версию здесь или через chocolatey ( choco install fusionplusplus).

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

Fusion ++


1
Уважаемый сэр, вы бог!
Сильвен Джирард

1
Это удивительный инструмент, спасибо большое!
simoneL

3

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

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

  2. Перейдите в Дополнительные настройки этого пула приложений.

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

  4. Укажите ваше веб-приложение, чтобы использовать этот новый пул


чувак, ты спас мой день, мне понадобилось около 8 часов, чтобы решить проблему. огромное спасибо. :)
Дика Арта Каруня

3

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

Сценарий будет что-то вроде:

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

Вкратце: A --- нагрузки -> B (несвежие) --- ссылки ---> C

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


3

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.