2012年7月12日木曜日

WinDbgで、エラー報告データを解析2(.NETfx 2.0向け)

前回の続編です。

今回は、スタックトレースを見ながら要因を追跡していきます。

WinDbgを起動します。

[File]→[Open Crash Dump...]

次の場所を開く(Windows Server 2003):
%USERPROFILE%\Local Settings\Application Data\PCHealth\ErrorRep\QSignoff

8C80969E.cab等、cabを開きます。

~~~

打ち込みます(.NET Framework 2.0対応のため)

.load C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\sos.dll

結果:
0:002> .load C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\sos.dll

------------------------------------------------------------ 
sos.dll needs a full memory dump for complete functionality. 
You can create one with .dump /ma <filename>
------------------------------------------------------------ 

~~~

打ち込みます。発出された例外を表示。

!pe

結果:
0:002> !pe
Exception object: 09fb423c
Exception type: System.IO.IOException
Message: 指定されたネットワーク名は利用できません。
InnerException: <none>
StackTrace (generated):

SP       IP       Function
00A4FB64 799D0B09 mscorlib_ni!System.IO.__Error.WinIOError(Int32, System.String)+0x75c9f9
00A4FBC0 79A0CE90 mscorlib_ni!System.IO.FileStream.WriteCore(Byte[], Int32, Int32)+0x7221a0
00A4FBE0 792EACD2 mscorlib_ni!System.IO.FileStream.FlushWrite(Boolean)+0x22
00A4FBF0 792EB7F7 mscorlib_ni!System.IO.FileStream.Dispose(Boolean)+0x57
00A4FC20 792CA80B mscorlib_ni!System.IO.FileStream.Finalize()+0x1b

StackTraceString: <none>
HResult: 80070040

考察:
  • FileStreamがExceptionの発生源になっています。
  • FileStreamは、ファイル名を持っているはずなので、それを探ってみたいと思います。

~~~

打ち込みます(スタックトレースを表示します)

!CLRStack -p

結果:

0:002> !CLRStack -p
OS Thread Id: 0x2198 (2)
ESP       EIP 
00a4fac0 7c97845c [HelperMethodFrame: 00a4fac0] 
00a4fb64 799d0b09 System.IO.__Error.WinIOError(Int32, System.String)
  PARAMETERS:
   errorCode = <no data>
   maybeFullPath = <no data>

00a4fbc0 79a0ce90 System.IO.FileStream.WriteCore(Byte[], Int32, Int32)
  PARAMETERS:
   this = <no data>
   buffer = <no data>
   offset = <no data>
   count = <no data>

00a4fbe0 792eacd2 System.IO.FileStream.FlushWrite(Boolean)
  PARAMETERS:
   this = 0x010a3550
   calledFromFinalizer = <no data>

00a4fbf0 792eb7f7 System.IO.FileStream.Dispose(Boolean)
  PARAMETERS:
   this = 0x010a3550
   disposing = 0x00000000

00a4fc20 792ca80b System.IO.FileStream.Finalize()
  PARAMETERS:
   this = <no data>

考察:
  • FileStreamのthisポインタが露出しています。
  • FileStreamのthisポインタから、インスタンスの内容物を解剖します。
~~~

打ち込みます。FileStreamのthisポインタをダンプします。

!do 0x010a3550

結果:
0:002> !do 0x010a3550
Name: System.IO.FileStream
MethodTable: 793051f4
EEClass: 790df0f0
Size: 80(0x50) bytes
 (C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
79330888  400018a        4        System.Object  0 instance 00000000 __identity
7992db14  4001b70        8 ...ream+ReadDelegate  0 instance 00000000 _readDelegate
7992dba0  4001b71        c ...eam+WriteDelegate  0 instance 00000000 _writeDelegate
7931c008  4001b72       10 ...ng.AutoResetEvent  0 instance 00000000 _asyncActiveEvent
79332eb8  4001b73       14         System.Int32  1 instance        1 _asyncActiveCount
7932e968  4001b6f      574     System.IO.Stream  0   shared   static Null
    >> Domain:Value  00161ee0:0109bab4 <<
793336dc  4001bfb       28        System.Byte[]  0 instance 010a4a90 _buffer
79330c6c  4001bfc       2c        System.String  0 instance 010a35a0 _fileName
79304738  4001bfd       44       System.Boolean  1 instance        0 _isAsync
79304738  4001bfe       45       System.Boolean  1 instance        0 _canRead
79304738  4001bff       46       System.Boolean  1 instance        1 _canWrite
79304738  4001c00       47       System.Boolean  1 instance        1 _canSeek
79304738  4001c01       48       System.Boolean  1 instance        0 _exposedHandle
79304738  4001c02       49       System.Boolean  1 instance        0 _isPipe
79332eb8  4001c03       34         System.Int32  1 instance        0 _readPos
79332eb8  4001c04       38         System.Int32  1 instance        0 _readLen
79332eb8  4001c05       3c         System.Int32  1 instance     4096 _writePos
79332eb8  4001c06       40         System.Int32  1 instance     4096 _bufferSize
7932ec38  4001c07       30 ...es.SafeFileHandle  0 instance 010a3640 _handle
793324f8  4001c08       18         System.Int64  1 instance 111877 _pos
793324f8  4001c09       20         System.Int64  1 instance -1 _appendStart
79304738  4001bf9      adc       System.Boolean  1   shared   static _canUseAsync
    >> Domain:Value  00161ee0:1 <<
79334198  4001bfa      57c ...ompletionCallback  0   shared   static IOCallback
    >> Domain:Value  00161ee0:0109d148 <<

考察:
  • _fileName が 010a35a0 を指しています。
~~~

打ち込みます。

!do 010a35a0


結果:
0:002> !do 010a35a0 
Name: System.String
MethodTable: 79330c6c
EEClass: 790ed65c
Size: 158(0x9e) bytes
 (C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)
String: \\192.168.2.119\share\DD7Backup\FDSET\DD7Backup遠方(11日)(夜)(Set1)(遠).log
Fields:
      MT    Field   Offset                 Type VT     Attr    Value Name
79332eb8  4000096        4         System.Int32  1 instance       71 m_arrayLength
79332eb8  4000097        8         System.Int32  1 instance       70 m_stringLength
7933194c  4000098        c          System.Char  1 instance       5c m_firstChar
79330c6c  4000099       10        System.String  0   shared   static Empty
    >> Domain:Value  00161ee0:01091198 <<
7933189c  400009a       14        System.Char[]  0   shared   static WhitespaceChars
    >> Domain:Value  00161ee0:01091714 <<

考察:
  • 知りたかった情報が露出しました。

「指定されたネットワーク名は利用できません」の発生原因は、
バックアップのログファイルを書き込んでいる最中に、
NASがダウンしたからだ、と考えられます。


※ google-code-prettifyを組み込み、表示を最適化しました。

参考:SOS.dll (SOS デバッガー拡張)

0 件のコメント:

コメントを投稿