重绘标签时,解决GTK中的大内存泄漏问题

Ste*_*der 8 python gtk pygtk pango

我正在使用最新版本的PyGTK All-in-One安装程序(2.24.2)用于Python 2.7,其中包括Cairo 1.10.8,Pango 1.29.4,PyGTK 2.24.0和PyGobject 2.28.3(我认为) .

以下代码泄漏~55 MB的内存:

import gtk

window = gtk.Window()
label = gtk.Label()
window.add(label)
window.show_all()
for _ in range(100000):
    label.set_markup('Leaking memory!')
    while gtk.events_pending():
        gtk.main_iteration()
Run Code Online (Sandbox Code Playgroud)

注意:for循环在我的测试脚本中,所以我可以看到任务管理器中的内存消耗增加.它本质上也是我真实应用程序中发生的事情,除了标签文本每秒至少更改一次,而不是每次都重写相同的文本.

问题是label.set_markup(),每次呼叫泄漏大约0.5kB,所以我怀疑问题出在GTK或Cairo的某个地方.正如评论者指出的那样,这可能是这个错误(685959).

我尝试使用objgraph来查看是否有任何额外的Python对象与调用次数成比例显示,gtk.Label.set_markup()但没有多余的对象.接下来,调用gc.collect()没有帮助,我试着确定.Python似乎并不知道负责内存消耗的对象.

我如何找到这个内存泄漏,和/或解决它?我需要使用标记来为这个应用程序设置一些文本的样式,但我尝试使用它gtk.Label.set_text()作为一种解决方法,它也会泄漏内存.

我应该注意到这个应用程序针对Windows,因此使用PyGObject来获取GTK 3不是一个选项 - 在Windows上仍然没有GObject内省.

Ste*_*der 3

Bug (685959)确实是问题所在。该错误在 gtk+ 2.24.14 中已修复。但是,2.24.14 无法针对 win32 进行编译(我希望任何阅读我的问题和答案的人都意识到,GTK 不再是一个合理的选择或跨平台开发)。

将此补丁应用到2.24.10并成功编译结果。使用我的新运行时文件,它似乎可以正常工作。

我使用此处的说明使用 MinGW 在 Windows 上构建 GTK: http: //ingar.intranifty.net/devenv/mingw32/gtk.html

除非您以管理员身份运行 msys shell,否则 32 位构建将因 gtk-update-icon-cache 而失败。对于 64 位构建,您需要在运行 make 之前 rm gtk/gtk.def。通过执行以下命令构建并安装 gtk+:

cd $LOCALBUILDDIR && \ wget -c http://ftp.gnome.org/pub/gnome/sources/gtk+/2.24/gtk+-2.24.10.tar.xz && \ xz -d -c gtk+-2.24.10。焦油.xz | tar xv && \ cd gtk+-2.24.10 && \ ./configure --prefix=$LOCALDESTDIR --with-gdktarget=win32 \ --with-included-immodules=ime --disable-debug --disable-gtk-doc && \ 制作 && \ 制作安装

我知道这不是我在问题中要求的“解决方法”,但超过 6 个月没有答案告诉我,除了修复运行时中的错误之外没有解决方法......