Расшифровка параметров исключения .NET clr20r3 P1..P10


79

Я пытаюсь расшифровать значение параметров P1 ... P10, связанных с a, clr20r3который записывается в журнал событий, когда в моем приложении возникает исключение.

Лучшее, что мне удалось найти, это:

  • P1 : процесс хостинга ( например w3wp.exe )
  • P2 : версия процесса хостинга ( например 6.0.3790.1830 )
  • P3 : ??? ( например 42435be1 )
  • P4 : сборка, из которой возникло исключение ( например mrtables.webservice )
  • P5 : версия сборки ( например 2.1.2.0 )
  • P6 : ??? ( например 4682617f )
  • P7 : ??? ( например 129 )
  • P8 : ??? ( например 50 )
  • P9 : возникший тип исключения ( например system.argumentexception )
  • P10 : ??? ( например NIL )

Поиск в Google для clr20r3 предоставляет тысячи примеров значений параметров, из которых кто-то может попытаться получить шаблон.

Но я надеюсь на документацию по значениям параметров, а не на обоснованные предположения.


Изменить: хотя я могу надеяться на каноническую документацию, на самом деле я был бы счастлив увидеть исключение, в какой строке, с трассировкой стека.

Бонусное чтение


Ответы:


81

Вот информация о ведрах Watson

  1. Имя EXE-файла
  2. Номер версии сборки EXE-файла
  3. Штамп EXE-файла
  4. Полное имя сборки exe-файла
  5. Версия неисправной сборки
  6. Отметка времени сбойной сборки
  7. Ошибка метода сборки def
  8. Метод сбоя IL Смещение в методе сбоя
  9. Тип исключения

А также вот статья MSDN об этом.

Образец:

  Problem Signature 01: devenv.exe
  Problem Signature 02: 11.0.50727.1
  Problem Signature 03: 5011ecaa
  Problem Signature 04: Microsoft.VisualStudio.SharePoint.Project
  Problem Signature 05: 11.0.60226.0
  Problem Signature 06: 512c2dba
  Problem Signature 07: 18a8
  Problem Signature 08: 1d
  Problem Signature 09: System.NullReferenceException

2
У вас есть справочная ссылка, которая документирует остальные ведра Watson? В связанной статье упоминаются только три из них (и только случайно упоминаются их мимоходом ). Например, сегмент P4 описывает неисправный модуль, сегмент P9 отображает тип исключения, которое не было обработано, а сегмент P8 представляет смещение IL, при котором исключение был изначально брошен. " )
Ян Бойд

2
Я добавил образец об этом
Kiquenet

111

P7 и P8 являются важными, чтобы выяснить, где возникло исключение P9. Используйте P4, чтобы узнать, какую сборку искать. Запустите ildasm.exe и откройте эту сборку. Файл + Дамп, поставьте галочку напротив «Значения токенов», ОК и сохраните куда-нибудь файл .il.

Откройте файл в текстовом редакторе. P7 дает вам токен метода, он начинается с 0x06, производя значение токена «06000129». Искать:

.method /*06000129*/

Это дает вам имя метода, посмотрите оттуда, чтобы найти .class, который дает вам имя класса.

P8 дает вам смещение IL. В найденном .method найдите IL_0050 для инструкции, вызвавшей исключение. Сопоставить это с вашим исходным кодом немного сложно, но вы, вероятно, разберетесь в этом. При необходимости используйте Reflector.

В общем, напишите обработчик событий, AppDomain.UnhandledExceptionчтобы избежать боли, связанной с реверс-инжинирингом этих корзин сбоя Watson. Зарегистрируйте значение, e.ExceptionObject.ToString()чтобы получить как сообщение об исключении, так и трассировку стека.


2
Если исключение возникает в коде библиотеки, вам, вероятно, в любом случае понадобится трассировка стека, чтобы выяснить, какой из ваших кодов был в стеке. (Было бы неплохо, если бы Microsoft
изменила

1
Помимо обработки UnhandledException, он также помогает попробовать / поймать прямо внутри Main, поскольку иногда проблема возникает до того, как будет установлен обработчик UnhandledException.
Марк Лаката

1
Я думаю, это спасет меня, мой друг. У меня на коленях упало приложение ASP.NET, которое продолжает давать сбой в пуле приложений, и список ошибок CLR20R3с кучей этих Pзначений регистрируется как раз во время сбоя. Это может быть беспорядочно, но это, вероятно, приведет меня к решению, но, в конце концов, мне придется изменить этот код и получить реальное ведение журнала.
Майк Перрено

1
Очень полезно +10, если бы я мог - в моем случае это было исключение StackOverFlow, и мой блог не работал.
Marc

1
После этого я обнаружил, что функция, в которой происходит сбой нашего кода, является абстрактной виртуальной функцией .. method / * 06003452 * / public hidebysig newslot abstract virtual instance int32 Read ([in] [out] uint8 [] buffer, int32 offset, int32 count) cil managed {} // конец метода Stream :: Read
Стивен Скотт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.