在cairo或windows上的gtk重新聚焦时发生GDI对象泄漏?

在cairo或windows上的gtk重新聚焦时发生GDI对象泄漏?,gtk,gdi,cairo,resource-leak,Gtk,Gdi,Cairo,Resource Leak,我有一个使用cairo、poppler和gtk+的程序gummi。每次我用alt tab切换焦点,但当我用其他方法改变焦点时,任务管理器告诉我它获得10-20个GDI对象。GDIView告诉我这些主要是位图和DC,尽管它们只占GDI总数的大部分;所有GDI的数量是GDI总数的3-4倍 我怎么才能确定这是否是gummi中的一个bug呢?我认为这不太可能,因为我认为gummi在重新聚焦/重画、cairo、poppler或gtk上没有任何作用?我如何找到bug所在的位置,以便提交bug报告?或者,如果

我有一个使用cairo、poppler和gtk+的程序gummi。每次我用alt tab切换焦点,但当我用其他方法改变焦点时,任务管理器告诉我它获得10-20个GDI对象。GDIView告诉我这些主要是位图和DC,尽管它们只占GDI总数的大部分;所有GDI的数量是GDI总数的3-4倍

我怎么才能确定这是否是gummi中的一个bug呢?我认为这不太可能,因为我认为gummi在重新聚焦/重画、cairo、poppler或gtk上没有任何作用?我如何找到bug所在的位置,以便提交bug报告?或者,如果这是gtk/cairo/poppler的已知错误,有人能告诉我错误报告吗

正如在其他线程中提到的,windows将一个进程限制为10000个句柄,而我也遇到过gummi segfault,大概是因为达到了这个限制。下面复制了此类事件的gdb回溯

(gummi.exe:14008): Gdk-WARNING **: gdkgc-win32.c:830: SaveDC failed: The operation completed successfully.

(gummi.exe:14008): Gdk-WARNING **: gdkgc-win32.c:970: RestoreDC failed: The operation completed successfully.
pnc=: T
Program received signal SIGSEGV, Segmentation fault.
0x68de05bd in cairo_image_surface_get_data ()
   from d:\opt\gtk\bin\libcairo-2.dll
(gdb) bt
#0  0x68de05bd in cairo_image_surface_get_data ()
   from d:\opt\gtk\bin\libcairo-2.dll
#1  0x6c38d268 in _gdk_pixmap_new ()
   from d:\opt\gtk\bin\libgdk-win32-2.0-0.dll
#2  0x62d453a5 in draw_extension ()
   from d:\opt\gtk\lib\gtk-2.0\2.10.0\engines\libwimp.dll
#3  0x0155fdb6 in gtk_notebook_draw_tab ()
   from d:\opt\gtk\bin\libgtk-win32-2.0-0.dll
#4  0x015601d7 in gtk_notebook_expose ()
   from d:\opt\gtk\bin\libgtk-win32-2.0-0.dll
#5  0x0153b916 in _gtk_marshal_BOOLEAN__BOXED ()
   from d:\opt\gtk\bin\libgtk-win32-2.0-0.dll
#6  0x63a451f9 in g_closure_invoke ()
   from d:\opt\gtk\bin\libgobject-2.0-0.dll
#7  0x63a54512 in signal_emit_unlocked_R ()
   from d:\opt\gtk\bin\libgobject-2.0-0.dll
#8  0x63a5b614 in g_signal_emit_valist ()
   from d:\opt\gtk\bin\libgobject-2.0-0.dll
#9  0x63a5b962 in g_signal_emit ()
   from d:\opt\gtk\bin\libgobject-2.0-0.dll
#10 0x0165b557 in gtk_widget_event_internal ()
   from d:\opt\gtk\bin\libgtk-win32-2.0-0.dll
#11 0x014b6b0d in gtk_container_propagate_expose ()
   from d:\opt\gtk\bin\libgtk-win32-2.0-0.dll
#12 0x014b6b48 in gtk_container_expose_child ()
   from d:\opt\gtk\bin\libgtk-win32-2.0-0.dll
#13 0x0147c026 in gtk_box_forall ()
   from d:\opt\gtk\bin\libgtk-win32-2.0-0.dll
#14 0x014b5436 in gtk_container_forall ()
   from d:\opt\gtk\bin\libgtk-win32-2.0-0.dll
#15 0x014b5611 in gtk_container_expose ()
   from d:\opt\gtk\bin\libgtk-win32-2.0-0.dll
#16 0x0153b916 in _gtk_marshal_BOOLEAN__BOXED ()
   from d:\opt\gtk\bin\libgtk-win32-2.0-0.dll
#17 0x63a451f9 in g_closure_invoke ()
   from d:\opt\gtk\bin\libgobject-2.0-0.dll
#18 0x63a54512 in signal_emit_unlocked_R ()
   from d:\opt\gtk\bin\libgobject-2.0-0.dll
#19 0x63a5b614 in g_signal_emit_valist ()
   from d:\opt\gtk\bin\libgobject-2.0-0.dll
#20 0x63a5b962 in g_signal_emit ()
   from d:\opt\gtk\bin\libgobject-2.0-0.dll
#21 0x0165b557 in gtk_widget_event_internal ()
   from d:\opt\gtk\bin\libgtk-win32-2.0-0.dll
#22 0x014b6b0d in gtk_container_propagate_expose ()
   from d:\opt\gtk\bin\libgtk-win32-2.0-0.dll
#23 0x014b6b48 in gtk_container_expose_child ()
   from d:\opt\gtk\bin\libgtk-win32-2.0-0.dll
#24 0x0156a555 in gtk_paned_forall ()
   from d:\opt\gtk\bin\libgtk-win32-2.0-0.dll
#25 0x014b5436 in gtk_container_forall ()
   from d:\opt\gtk\bin\libgtk-win32-2.0-0.dll
#26 0x014b5611 in gtk_container_expose ()
   from d:\opt\gtk\bin\libgtk-win32-2.0-0.dll
#27 0x0156a894 in gtk_paned_expose ()
   from d:\opt\gtk\bin\libgtk-win32-2.0-0.dll
#28 0x0153b916 in _gtk_marshal_BOOLEAN__BOXED ()
   from d:\opt\gtk\bin\libgtk-win32-2.0-0.dll
#29 0x63a451f9 in g_closure_invoke ()
   from d:\opt\gtk\bin\libgobject-2.0-0.dll
#30 0x63a54512 in signal_emit_unlocked_R ()
   from d:\opt\gtk\bin\libgobject-2.0-0.dll
#31 0x63a5b614 in g_signal_emit_valist ()
   from d:\opt\gtk\bin\libgobject-2.0-0.dll
#32 0x63a5b962 in g_signal_emit ()
   from d:\opt\gtk\bin\libgobject-2.0-0.dll
#33 0x0165b557 in gtk_widget_event_internal ()
   from d:\opt\gtk\bin\libgtk-win32-2.0-0.dll
#34 0x014b6b0d in gtk_container_propagate_expose ()
   from d:\opt\gtk\bin\libgtk-win32-2.0-0.dll
#35 0x014b6b48 in gtk_container_expose_child ()
   from d:\opt\gtk\bin\libgtk-win32-2.0-0.dll
#36 0x0147c026 in gtk_box_forall ()
   from d:\opt\gtk\bin\libgtk-win32-2.0-0.dll
#37 0x014b5436 in gtk_container_forall ()
   from d:\opt\gtk\bin\libgtk-win32-2.0-0.dll
#38 0x014b5611 in gtk_container_expose ()
   from d:\opt\gtk\bin\libgtk-win32-2.0-0.dll
#39 0x0153b916 in _gtk_marshal_BOOLEAN__BOXED ()
   from d:\opt\gtk\bin\libgtk-win32-2.0-0.dll
#40 0x63a451f9 in g_closure_invoke ()
   from d:\opt\gtk\bin\libgobject-2.0-0.dll
#41 0x63a54512 in signal_emit_unlocked_R ()
   from d:\opt\gtk\bin\libgobject-2.0-0.dll
#42 0x63a5b614 in g_signal_emit_valist ()
   from d:\opt\gtk\bin\libgobject-2.0-0.dll
#43 0x63a5b962 in g_signal_emit ()
   from d:\opt\gtk\bin\libgobject-2.0-0.dll
#44 0x0165b557 in gtk_widget_event_internal ()
   from d:\opt\gtk\bin\libgtk-win32-2.0-0.dll
#45 0x014b6b0d in gtk_container_propagate_expose ()
   from d:\opt\gtk\bin\libgtk-win32-2.0-0.dll
#46 0x014b6b48 in gtk_container_expose_child ()
   from d:\opt\gtk\bin\libgtk-win32-2.0-0.dll
#47 0x014b5436 in gtk_container_forall ()
   from d:\opt\gtk\bin\libgtk-win32-2.0-0.dll
#48 0x014b5611 in gtk_container_expose ()
   from d:\opt\gtk\bin\libgtk-win32-2.0-0.dll
#49 0x0153b916 in _gtk_marshal_BOOLEAN__BOXED ()
   from d:\opt\gtk\bin\libgtk-win32-2.0-0.dll
#50 0x63a452c2 in g_closure_invoke ()
   from d:\opt\gtk\bin\libgobject-2.0-0.dll
#51 0x63a54512 in signal_emit_unlocked_R ()
   from d:\opt\gtk\bin\libgobject-2.0-0.dll
#52 0x63a5b614 in g_signal_emit_valist ()
   from d:\opt\gtk\bin\libgobject-2.0-0.dll
#53 0x63a5b962 in g_signal_emit ()
   from d:\opt\gtk\bin\libgobject-2.0-0.dll
#54 0x0165b557 in gtk_widget_event_internal ()
   from d:\opt\gtk\bin\libgtk-win32-2.0-0.dll
#55 0x0153a22f in gtk_main_do_event ()
   from d:\opt\gtk\bin\libgtk-win32-2.0-0.dll
#56 0x6c3641dd in _gdk_window_process_updates_recurse ()
   from d:\opt\gtk\bin\libgdk-win32-2.0-0.dll
#57 0x6c35f6b6 in gdk_window_process_updates_internal ()
   from d:\opt\gtk\bin\libgdk-win32-2.0-0.dll
#58 0x6c361497 in gdk_window_process_all_updates ()
   from d:\opt\gtk\bin\libgdk-win32-2.0-0.dll
#59 0x6c361507 in gdk_window_update_idle ()
   from d:\opt\gtk\bin\libgdk-win32-2.0-0.dll
#60 0x6c34137c in gdk_threads_dispatch ()
   from d:\opt\gtk\bin\libgdk-win32-2.0-0.dll
#61 0x685eb167 in g_main_context_dispatch ()
   from d:\opt\gtk\bin\libglib-2.0-0.dll
#62 0x685eb90d in g_main_context_iterate.clone.5 ()
   from d:\opt\gtk\bin\libglib-2.0-0.dll
#63 0x685ebd9d in g_main_loop_run ()
   from d:\opt\gtk\bin\libglib-2.0-0.dll
#64 0x01539038 in gtk_main ()
   from d:\opt\gtk\bin\libgtk-win32-2.0-0.dll
#65 0x0040950e in gui_main (builder=0x33f5090) at gui/gui-main.c:281
#66 0x00428378 in main (argc=1, argv=0x3f56c8) at main.c:157
(gdb)

我正在使用cairo和gtk+,从gtk+-bundle_2.24.10-20120208_win32下载,下载地址为。该项目还使用了gtksourceview-2.10.0、libpng-1.5.10、openjpeg-1.5.0、poppler-0.18.4和其他一些库,这些库都是从MinGW下的源代码构建的,我认为它们与图形无关。

GTK团队不会忽视这种问题,这很可能是一个gummi bug。检查该程序的expose事件信号处理程序,确保它在不释放内容的情况下不会分配内容

GDI泄密确实很棘手,MFC在这方面有问题,问题是应用程序

更新: 看来我错了,是的。
您还可以在上找到一些建议。

我使用的是Windows 7,错误报告表明此错误没有出现在Windows 7上,但今天晚些时候有机会时,我会检查gtk测试程序。我不确定这是否是同一个错误;gtk演示在使用alt tab重新聚焦时泄漏GDI对象,但一旦计数达到320左右,它似乎就停止泄漏这些对象。