【问题标题】:How can i extract the image out of 'System.Drawing.Bitmap' to file via windbg?如何从“System.Drawing.Bitmap”中提​​取图像并通过 windbg 归档?
【发布时间】:2013-11-14 10:52:34
【问题描述】:

我有一个内存转储文件,其中似乎是“System.Drawing.Bitmap”对象的内存泄漏。 我有多个该类型的对象,!gcroot 无法帮助我确定泄漏的位置。

示例输出:

域(0071D148):句柄(固定):1513e8:根: 03335250(System.Object[])-> 0248e8ec(System.Drawing.Bitmap)

我有一个想法,将内存转储中的图像提取到图像文件中,然后,当我可以看到泄漏的图像是什么时,我可以检查围绕该特定位图创建的源代码。

那么,如何将内存写入可以在图像查看器中打开并查看 Bitmap 对象保存的图像的文件?

另外,如果您对如何识别泄漏源有其他想法,我很乐意听到。

谢谢

【问题讨论】:

    标签: .net memory-leaks windbg


    【解决方案1】:

    System.Drawing.Bitmap 是一个很小的托管对象。它包装了一个由非托管 GDI+ api 返回的句柄,存储在私有 nativeImage 字段中。从该句柄中查找位图数据是大海捞针中的一项练习。位图数据也不以任何方式与图像文件格式兼容,只有 Bitmap::Save() 调用可以做到这一点,运行所需的图像编码器。

    暂缓这个想法。

    Bitmap 对象存在内存问题在其他方面非常很常见。太多的程序员忽略了 Bitmap 继承了 IDisposable。您可以编写大量 .NET 程序,而从不调用 Dispose() 或使用 using 语句,并且程序运行良好。垃圾收集器让他们远离麻烦。然而,Bitmap 类是单一的 .NET 类,它不能再工作了。问题是它很小。您可以在触发垃圾收集之前创建数万个。几乎不足以让垃圾收集器释放非托管 GDI+ 句柄。结果,程序运行非常繁重,使用大量非托管内存。当程序在 32 位模式下运行时,很可能发生 OOM 崩溃。或者在 64 位模式下提交大小为千兆字节

    在迷失在 Windbg 之前,请先仔细查看程序的源代码。并验证您可以将 每个 位图变量与相应的 Dispose() 调用或 using 语句配对。请注意在没有代码的情况下分配 PictureBox.Image 属性之类的事情,该代码在前一个图像上调用 Dispose() 方法。 .NET 内存分析器是更好的调试工具。

    【讨论】:

    • 感谢您的评论。我正在处理一个非常大的程序,并且很难扫描所有使用位图的地方。这就是为什么我认为我的想法可以将我引导到代码中更具体的位置。
    • 这不是评论,而是答案。最后一句话让您毫无疑问地在一个非常大的程序中解决这个问题。内存分析器显示大海捞针,这是他们的工作。
    • 内存转储来自客户,问题在我的环境中没有重复,因此我无法使用分析器实时调试它。无论如何,再次感谢您的回答。
    【解决方案2】:

    如果你真的想这样做,dump all bitmaps from memory 似乎仍然可以。

    步骤:

    1. !dumpheap -short -type System.Drawing.Bitmap
    2. !do <address>
    3. 查找属性nativeImage的偏移量
    4. dps 在 IntPtr 上(等于 dps poi(<address>+<offset>) ?)为您提供类型
    5. dt <address> <type> --> InternalBitmap 属性
    6. dt <internalAddress> <internalType> --> Bmp 属性
    7. dt <bmpAddress> <bmpType>给出Scan0属性,即起始地址

    我只是不知道如何计算位图的大小,这是执行.writemem 所必需的。有宽度和高度,可能 PixelFormat 可用于计算每个像素的位数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-14
      • 2018-12-06
      • 2021-05-11
      • 1970-01-01
      • 2023-03-21
      • 2019-12-14
      • 1970-01-01
      相关资源
      最近更新 更多