2015-12-28 9 views
4

Я пытаюсь разобрать отчет об ошибках Windows (Report.wer).Загадочное смещение IL отчета WER

Вот часть отчета:

Version=1 
EventType=CLR20r3 

... snip ... 

Sig[0].Name=問題の署名 01 
Sig[0].Value=myapp.exe 
Sig[1].Name=問題の署名 02 
Sig[1].Value=2.2.0.1 
Sig[2].Name=問題の署名 03 
Sig[2].Value=541bc264 
Sig[3].Name=問題の署名 04 
Sig[3].Value=System 
Sig[4].Name=問題の署名 05 
Sig[4].Value=2.0.0.0 
Sig[5].Name=問題の署名 06 
Sig[5].Value=4a275e12 
Sig[6].Name=問題の署名 07 
Sig[6].Value=2919 
Sig[7].Name=問題の署名 08 
Sig[7].Value=ef 
Sig[8].Name=問題の署名 09 
Sig[8].Value=System.IO.IOException 

... snip ... 

(где 問題の署名 означает Problem Signature.)

Наученные SO Deciphering the .NET clr20r3 exception parameters P1..P10, я понял, что:

  • Сбойная сборка System версии 2.0.0.0.
  • Ток с дефектом 06002919.
  • Ошибка отклонения IL ef.

Но проблема в значении смещения IL ef.

Метод 06002919 от System не имеет IL_00ef.

Вот определение метода 06002919:

.method /*06002919*/ assembly hidebysig 
      instance bool Poll(int32 microSeconds, 
           valuetype System.Net.Sockets.SelectMode/*0200059D*/ mode) cil managed 
    { 
    // コード サイズ  81 (0x51) 
    .maxstack 4 
    .locals /*11000641*/ init (class System.Net.Sockets.Socket/*020005A0*/ V_0, 
      object[] V_1) 
    IL_0000: ldarg.0 
    IL_0001: ldfld  bool System.Net.Sockets.NetworkStream/*02000547*/::m_CleanedUp /* 040027EA */ 
    IL_0006: brfalse.s IL_0019 

    IL_0008: ldarg.0 
    IL_0009: call  instance class [mscorlib/*23000001*/]System.Type/*01000065*/ [mscorlib/*23000001*/]System.Object/*01000001*/::GetType() /* 0A00006C */ 
    IL_000e: callvirt instance string [mscorlib/*23000001*/]System.Type/*01000065*/::get_FullName() /* 0A000136 */ 
    IL_0013: newobj  instance void [mscorlib/*23000001*/]System.ObjectDisposedException/*01000179*/::.ctor(string) /* 0A0006A9 */ 
    IL_0018: throw 

    IL_0019: ldarg.0 
    IL_001a: ldfld  class System.Net.Sockets.Socket/*020005A0*/ System.Net.Sockets.NetworkStream/*02000547*/::m_StreamSocket /* 040027E5 */ 
    IL_001f: stloc.0 
    IL_0020: ldloc.0 
    IL_0021: brtrue.s IL_0048 

    IL_0023: ldstr  "net_io_readfailure" /* 70011B97 */ 
    IL_0028: ldc.i4.1 
    IL_0029: newarr  [mscorlib/*23000001*/]System.Object/*01000001*/ 
    IL_002e: stloc.1 
    IL_002f: ldloc.1 
    IL_0030: ldc.i4.0 
    IL_0031: ldstr  "net_io_connectionclosed" /* 70011BBD */ 
    IL_0036: call  string System.SR/*02000009*/::GetString(string) /* 06000029 */ 
    IL_003b: stelem.ref 
    IL_003c: ldloc.1 
    IL_003d: call  string System.SR/*02000009*/::GetString(string, 
                   object[]) /* 06000028 */ 
    IL_0042: newobj  instance void [mscorlib/*23000001*/]System.IO.IOException/*01000161*/::.ctor(string) /* 0A0006FD */ 
    IL_0047: throw 

    IL_0048: ldloc.0 
    IL_0049: ldarg.1 
    IL_004a: ldarg.2 
    IL_004b: callvirt instance bool System.Net.Sockets.Socket/*020005A0*/::Poll(int32, 
                        valuetype System.Net.Sockets.SelectMode/*0200059D*/) /* 06002CDB */ 
    IL_0050: ret 
    } // end of method NetworkStream::Poll 

Могу ли я что-то неправильное? Как я могу правильно расшифровать отчет WER?


Источник System.dll Ил дамп выше берется из GAC (C: \ Windows \ Assembly \ GAC_MSIL \ System \ 2.0.0.0__b77a5c561934e089) на моей машине развития, а не на целевую машину.

+2

Есть много версий этого DLL вокруг, вы использовали очень старый. Я догадываюсь, что вы использовали ссылочную сборку из c: \ windows \ microsoft.net \ framework. Вам нужна копия System.dll, хранящаяся в GAC в c: \ windows \ assembly, желательно с этой машины. Но предрешено, что если токен метаданных верен, вызов функции native select() завершился неудачно. Если бы вы знали, почему :) [Читать] (https://msdn.microsoft.com/en-us/library/ty48b824%28v=vs.110%29.aspx). –

+0

@ HansPassant Хм, вы имеете в виду, что существуют различные версии System.dll, которые, похоже, имеют такую ​​же версию 2.0.0.0? – Ripple

+0

Я получил System.dll от GAC на своем компьютере разработчика (не на целевой машине). В любом случае, я добавлю, как это получилось позже. – Ripple

ответ

1

Проблема, скорее всего, вызвана несоответствиями между System.dll на машине, где вы пытаетесь декодировать журнал WER и машину, где произошло исключение. Grab System.dll с компьютера, где произошло исключение, и использовать его.

Например, на моем компьютере этот маркер (06002919) приводит к Timer конструктору :)

.class /*0200054C*/ abstract auto ansi nested assembly beforefieldinit Timer 
... 
{ 
    ... 
    .method /*06002919*/ assembly hidebysig specialname rtspecialname 
     instance void .ctor(int32 durationMilliseconds) cil managed 
    { 
    ... 
    IL_0018: ret 
    } // end of method Timer::.ctor 
} 
+0

Большое спасибо за ответ. К сожалению, целевая машина находится на заводе, охраняемом строгим контролем безопасности, поэтому я не могу легко это захватить ... Но я постараюсь проверить некоторые машины вокруг меня. – Ripple

+0

Я проверил, что существуют различные версии файлов (2.0.50727.nnnn) из System.dll, и все они имеют одну и ту же версию сборки 2.0.0.0. Полагаю, это ответ. – Ripple

+0

Теперь у меня есть DLL с целевой машины и найдено, что System.dll 2.0.50727.4927, где метод '06002919' является' NetworkStream :: BeginRead' и имеет 'IL_00ef'. Большое спасибо. – Ripple

 Смежные вопросы

  • Нет связанных вопросов^_^