代码之家  ›  专栏  ›  技术社区  ›  Paul Williams

使用windbg将托管字节[]的内容写入文件

  •  16
  • Paul Williams  · 技术社区  · 16 年前

    我有一个来自生产服务器的崩溃转储,它显示内存不足异常。异常本身在这里不相关。

    我碰巧跑了!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
    

    哇,56071048字节的缓冲区似乎有点大。我想看看这个缓冲区的内容:

    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
    

    这是一个巨大的阵列。我宁愿不!dumparray整个事情。我想在一个文件中查看输出。

    问题

    是否可以将此字节[]的内容转储到文件中?

    我熟悉.writemem命令,但似乎无法使其正常工作。我试着写了整个长度,但温德伯格不喜欢这样:

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

    我是否错误地格式化了.writemem命令?

    2 回复  |  直到 8 年前
        1
  •  28
  •   Brian Rasmussen    16 年前

    这个 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
    
        2
  •  0
  •   Dimitri Mestdagh Lancer.Yan    8 年前

    这就是我的工作:

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