gpt4 book ai didi

.net - 如何通过 windbg 从 'System.Drawing.Bitmap' 中提取图像到文件?

转载 作者:行者123 更新时间:2023-12-02 08:37:23 26 4
gpt4 key购买 nike

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

示例输出:

DOMAIN(0071D148):HANDLE(Pinned):1513e8:Root: 03335250(System.Object[])-> 0248e8ec(System.Drawing.Bitmap)

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

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

此外,如果您有其他关于如何识别泄漏源的想法,我很乐意听取他们的意见。

谢谢

最佳答案

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

打破这个想法。

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

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

关于.net - 如何通过 windbg 从 'System.Drawing.Bitmap' 中提取图像到文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19975734/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com