2010-10-27 48 views
15

我有一個來自顯示OutOfMemoryException的生產服務器的故障轉儲。這裏的例外本身並不相關。使用WinDbg將託管字節[]的內容寫入文件

我正好運行一個DSO來查看棧對象:

0:042> !dso 
OS Thread Id: 0x1014 (42) 
ESP/REG Object Name 
246eeb24 109a21bc System.UnhandledExceptionEventHandler 
246eeb2c 39083998 System.Runtime.Remoting.Proxies.__TransparentProxy 
246eeb34 39083b5c System.UnhandledExceptionEventArgs 
246eeb48 39073280 System.Byte[] 
246eec10 2e720050 System.OutOfMemoryException 
[snip] 
246ef250 0ac1c4d0 System.IO.MemoryStream <-- interesting 

我想將MemoryStream可能有一些做的錯誤,所以我甩了它:

0:042> !do 0ac1c4d0 
Name: System.IO.MemoryStream 
MethodTable: 7932d5e4 
EEClass: 790ec318 
Size: 52(0x34) bytes 
(C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll) 
Fields: 
     MT Field Offset     Type VT  Attr Value Name 
7933061c 400018a  4  System.Object 0 instance 00000000 __identity 
7992cbcc 4001b6c  8 ...ream+ReadDelegate 0 instance 00000000 _readDelegate 
7992cc58 4001b6d  c ...eam+WriteDelegate 0 instance 00000000 _writeDelegate 
7931bd9c 4001b6e  10 ...ng.AutoResetEvent 0 instance 00000000 _asyncActiveEvent 
79332c4c 4001b6f  14   System.Int32 1 instance  1 _asyncActiveCount 
7932e6fc 4001b6b  574  System.IO.Stream 0 shared static Null 
    >> Domain:Value 000dc0f0:NotInit 00109d58:109b6abc << 
79333470 4001c16  18  System.Byte[] 0 instance 50710038 _buffer 
79332c4c 4001c17  1c   System.Int32 1 instance  0 _origin 
79332c4c 4001c18  20   System.Int32 1 instance 56071048 _position 
79332c4c 4001c19  24   System.Int32 1 instance 56071048 _length 
79332c4c 4001c1a  28   System.Int32 1 instance 67108864 _capacity 
793044cc 4001c1b  2c  System.Boolean 1 instance  1 _expandable 
793044cc 4001c1c  2d  System.Boolean 1 instance  1 _writable 
793044cc 4001c1d  2e  System.Boolean 1 instance  1 _exposable 
793044cc 4001c1e  2f  System.Boolean 1 instance  1 _isOpen 

哇,56,071,048字節的緩衝區似乎有點大。我想看到這個緩衝器的內容:

0:042> !do 50710038 
Name: System.Byte[] 
MethodTable: 79333470 
EEClass: 790eeb6c 
Size: 67108876(0x400000c) bytes 
Array: Rank 1, Number of elements 67108864, Type Byte 
Element Type: System.Byte 
Fields: 
None 

數組的前10個元素均低於:

0:042> !dumparray -start 0 -length 10 50710038 
Name: System.Byte[] 
MethodTable: 79333470 
EEClass: 790eeb6c 
Size: 67108876(0x400000c) bytes 
Array: Rank 1, Number of elements 67108864, Type Byte 
Element Methodtable: 79333520 
[0] 50710040 
[1] 50710041 
[2] 50710042 
[3] 50710043 
[4] 50710044 
[5] 50710045 
[6] 50710046 
[7] 50710047 
[8] 50710048 
[9] 50710049 

這是一個巨大的數組。我寧願不要!拋棄整個事情。我想查看文件中的輸出。

問題

是否有可能這個字節[]的內容轉儲到一個文件?

我熟悉.writemem命令,但我似乎無法得到此工作。我試過寫全長,但WinDbg不喜歡:

0:042> .writemem C:\LargeBuffer.bin 50710040 L56071048 
                ^Range error in '.writemem C:\LargeBuffer.bin 50710040 l56071048' 

我是否格式化了.writemem命令不正確?

+0

可悲的是,這也阻止你兩個地址,其中範圍大於1MB之間寫入數據。 '.writemem blah.dat 0x05da0063 0x5ea1245'也失敗。 – Deanna 2014-09-04 16:25:42

回答

27

範圍的L修飾符的大小受到限制。如果您想繞過極限,請使用L?範圍修改器。下面的命令爲我工作:

0:000> !do 0x04cc1000 
Name:  System.Byte[] 
MethodTable: 68374944 
EEClass:  680aaf1c 
Size:  67108876(0x400000c) bytes 
Array:  Rank 1, Number of elements 67108864, Type Byte 
Element Type:System.Byte 
Content:  ................................................................................................................................ 
Fields: 
None 
0:000> .writemem c:\temp\array.bin 0x04cc1000 L?0x400000c 
Writing 400000c bytes 
+0

工作。謝謝! – 2010-10-28 13:30:13

+2

只是想指出,您需要將16個字節添加到初始地址,否則您將在二進制文件中包含方法表。 – 2012-10-16 20:39:29

0

這是對我工作:

.foreach($str {!DumpHeap /d -mt 00007ff890e96948 -min 0n126500 -short}){[email protected]$t0= dwo(${$str}+8)*2;.writemem e:\temp\str\${$str}.txt ${$str}+c L? @$t0}