我对开罗和GTK#有很多疑问(运行在.NET和Mono上)。我正在为MS Windows和Linux开发一个GTK#应用程序。我正在使用应用程序时,我正在使用GTK#2.12。Cairo.Surface正在泄漏...如何使用Monodevelop进行调试?
我创建了一个使用Cairo.ImageSurface和Cairo.Context对象的自定义小部件。据我所知,我调用了每个ImageSurface对象的Dispose方法和我在窗口小部件代码中创建的每个Context对象。
小部件响应“MouseOver”事件,重新绘制其DrawingArea的某些部分。
(第一个)问题: 几乎每个重绘操作都会增加一点点使用的内存量。时使用的存储器的量增加3个或4千字节的MonoDevelop中追踪日志面板显示我以下消息:
Cairo.Surface正在泄漏,程序员缺少调用Dispose 集MONO_CAIRO_DEBUG_DISPOSE跟踪分配迹线
该重绘插件的一部分的代码是这样的:
// SRGB is a custom struct, not from Gdk nor Cairo
void paintSingleBlock(SRGB color, int i)
{
using (Cairo.Context g = CairoHelper.Create (GdkWindow)) {
paintSingleBlock (g, color, i);
// We do this to avoid memory leaks. Cairo does not work well with the GC.
g.GetTarget().Dispose();
g.Dispose();
}
}
void paintSingleBlock(Cairo.Context g, SRGB color, int i)
{
var scale = Math.Pow (10.0, TimeScale);
g.Save();
g.Rectangle (x(i), y(i), w(i), h(i));
g.ClosePath();
g.Restore();
// We don't directly use stb.Color because in some cases we need more flexibility
g.SetSourceRGB (color.R, color.G, color.B);
g.LineWidth = 0;
g.Fill();
}
的(第二)的问题:好的,Monodevelop告诉我,我应该设置MONO_CAIRO_DEBUG_DISPOSE
来“跟踪分配轨迹”(为了找到泄漏,我想)...但我不知道如何设置这个环境变量(我在Windows中)。我使用bash和执行类似的尝试:
MONO_CAIRO_DEBUG_DISPOSE = 1 ./LightCreator.exe
但没有出现在标准错误,也没有标准输出...(既不消息出现在MonoDevelop中的应用跟踪面板)。我也不知道如何获取Monodevelop内部但没有Monodevelop的调试信息。
有人有调试GTK#或开罗#内存泄漏的经验吗?
在此先感谢。
您是否得到了一些改进? – 2014-12-13 15:28:14
我已经成功地清除了我的项目中的所有泄漏。一个来源是'FontOptions'用法。只要您从上下文修改字体选项,它就会开始泄漏...我必须确认其他潜在来源... – 2014-12-13 19:49:00
我还销毁了绘制调用之间的所有表面,我将字节数组中的位图缓存并从中重新创建表面周期(必须确认这是绝对必要的) – 2014-12-13 19:53:44