2010-10-27 96 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} 
相关问题