WER 报告的神秘 IL 偏移量
Mysterious IL offset of the WER report
我正在尝试解析 Windows 错误报告报告(Report.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
.
System
的方法 06002919
没有 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 报告?
上面IL转储的来源System.dll取自我开发机器上的GAC(C:\Windows\assembly\GAC_MSIL\System.0.0.0__b77a5c561934e089),而不是目标机器。
问题很可能是由于 System.dll 您尝试解码 WER 日志的机器和发生异常的机器之间的差异造成的。从发生异常的机器上抓取 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
}
我正在尝试解析 Windows 错误报告报告(Report.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
.
System
的方法 06002919
没有 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 报告?
上面IL转储的来源System.dll取自我开发机器上的GAC(C:\Windows\assembly\GAC_MSIL\System.0.0.0__b77a5c561934e089),而不是目标机器。
问题很可能是由于 System.dll 您尝试解码 WER 日志的机器和发生异常的机器之间的差异造成的。从发生异常的机器上抓取 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
}