我對開羅和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