Розшифровка параметрів винятку .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 )
  • Р6 : ??? ( наприклад 4682617f )
  • P7 : ??? ( наприклад 129 )
  • P8 : ??? ( наприклад 50 )
  • P9 : піднято тип виключення ( наприклад system.argumentexception )
  • P10 : ??? ( наприклад NIL )

Googling для clr20r3 надає тисячі зразків значень параметрів, з яких хтось може спробувати отримати шаблон.

Але я сподіваюся на документацію щодо значень параметрів, на відміну від освічених здогадів.


Редагувати: Хоча я можу сподіватися на канонічну документацію, дійсно я був би радий бачити виняток, у який рядок, разом із трасуванням стека.

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


Відповіді:


81

Ось інформація про Watson Buckets

  1. Ім'я файлу Exe
  2. Номер версії збірки файлу Exe
  3. Exe файл штамп
  4. Повне ім'я збірки файлу Exe
  5. Несправна версія збірки
  6. Несправна позначка часу складання
  7. Несправний спосіб складання деф
  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
Чи могли б ви мати посилання, яке документує решту відра Уотсона? У зв’язаній статті згадуються лише три з них (і трапляється згадувати їх лише побіжно "Наприклад, сегмент P4 описує несправний модуль, сегмент P9 відображає тип винятку, який не оброблявся, а сегмент P8 представляє зміщення IL, при якому виняток був спочатку кинутий ". )
Ян Бойд,

2
Я додав зразок про це
Кікенет

111

P7 та P8 - це найважливіші, щоб з’ясувати, де було порушено виняток P9. Використовуйте P4, щоб знати, яку збірку шукати. Запустіть ildasm.exe і відкрийте цю збірку. Файл + Дамп, встановіть прапорець "Значення маркерів", гаразд і збережіть десь файл .il.

Відкрийте файл у текстовому редакторі. P7 надає вам маркер методу, він починається з 0x06, створюючи значення маркера "06000129". Шукати:

.method /*06000129*/

Що дає вам назву методу, шукайте звідти, щоб знайти .class, який дає вам назву класу.

P8 дає вам зміщення IL. Зі знайденого методу. Шукайте IL_0050 для інструкції, яка викликала виняток. Повернути його у вихідний код трохи складно, але ви, мабуть, зрозумієте. За потреби використовуйте Reflector.

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


2
Якщо виняток трапляється в коді бібліотеки, вам, імовірно, все одно знадобиться трасування стека, щоб з’ясувати, який із коду був у стеку. (Було б непогано, якби Microsoft
змінила

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

1
Я думаю, це збирається врятувати мене, мій друг. У мене є програма ASP.NET, яка впала мені на коліна, і вона постійно збиває пул програм - і список помилок CLR20R3із цілою кількістю цих Pзначень реєструється безпосередньо під час аварійного завершення роботи. Це може бути брудно, але це, мабуть, призведе мене до рішення, але врешті-решт мені доведеться змінити цей код і почати реальну реєстрацію.
Mike Perrenoud,

1
Дуже корисно +10, якби міг - у моєму випадку це був виняток StackOverFlow, і мій блог catch не запускався.
Марк

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