Re: Valgrind and GTK libraries



Bill C wrote:

Valgrind is an excellent product, and is designed for programmer use only.

It shows where unreleased memory was allocated, so one can trace each 
chunk of memory to see if it should have been released, and take 
appropriate action it your code allocated it.

That is easy when when it obviously in client code. My particular issue
is that I am absolutely sure the code I am working on (I didn't write it
btw) is leaking GTK resources. Given this code leaks 20000 blocks and the 
GTK helloworld (far, far simpler) leaks 8000, how do I know which of
the 20000 leaks I can fix.

From this:

    http://www.mega-nerd.com/erikd/Blog/files/sweep-valgrind.txt.gz

lets look at one specific leak record:

  ==12528== 27,300 bytes in 175 blocks are still reachable in loss record 11,194 of 11,196
  ==12528==    at 0x4024C1C: malloc (vg_replace_malloc.c:195)
  ==12528==    by 0x4B342E3: g_malloc (gmem.c:131)
  ==12528==    by 0x4B4A418: g_slice_alloc (gslice.c:824)
  ==12528==    by 0x4B4A714: g_slice_alloc0 (gslice.c:833)
  ==12528==    by 0x474F8F6: g_type_create_instance (gtype.c:1654)
  ==12528==    by 0x4734747: g_object_constructor (gobject.c:1383)
  ==12528==    by 0x4735707: g_object_newv (gobject.c:1171)
  ==12528==    by 0x4736589: g_object_new_valist (gobject.c:1323)
  ==12528==    by 0x473670D: g_object_new (gobject.c:1086)
  ==12528==    by 0x4195924: ??? (in /usr/lib/libgtk-x11-2.0.so.0.1800.3)
  ==12528==    by 0x4197833: ??? (in /usr/lib/libgtk-x11-2.0.so.0.1800.3)
  ==12528==    by 0x4196787: gtk_menu_item_set_label (in /usr/lib/libgtk-x11-2.0.so.0.1800.3)
  ==12528==    by 0x4735CE3: g_object_newv (gobject.c:968)
  ==12528==    by 0x47365F0: g_object_new_valist (gobject.c:1364)
  ==12528==    by 0x473670D: g_object_new (gobject.c:1086)
  ==12528==    by 0x4197347: gtk_menu_item_new_with_label (in /usr/lib/libgtk-x11-2.0.so.0.1800.3)
  ==12528==    by 0x808E8AA: create_proc_menu (view.c:175)
  ==12528==    by 0x8096E2B: view_new (view.c:1167)
  ==12528==    by 0x8097638: view_new_all (view.c:2562)
  ==12528==    by 0x806713F: _sndfile_sample_load (file_sndfile1.c:712)
  ==12528==    by 0x8064BAF: try_sample_load (file_dialogs.c:225)
  ==12528==    by 0x8057FD2: initial_sample_load (main.c:73)
  ==12528==    by 0x4B2A100: g_idle_dispatch (gmain.c:4065)
  ==12528==    by 0x4B2BE87: g_main_context_dispatch (gmain.c:1960)
  ==12528==    by 0x4B2F72F: g_main_context_iterate (gmain.c:2591)
  ==12528==    by 0x4B2FB9E: g_main_loop_run (gmain.c:2799)
  ==12528==    by 0x4185418: gtk_main (in /usr/lib/libgtk-x11-2.0.so.0.1800.3)
  ==12528==    by 0x8057CAE: main (main.c:214)

The code uses gtk_menu_item_new_with_label() to create a submenu which gets
added to a menu which get attached to a top level window (one top level
window per open file). I would expect that the submenu gets cleaned up when
the top level window gets destroyed. Is that not the case?

Humans can make mistakes,

Yep, humans are completely hopeless :-).

but GTK is well tested.

I agree. The fact that GTK shows *zero* of the use-of/condition-jump on
uninitialied memory errors shows that the GTK devs have spent a lot of
time tracking down and killing all instances of that class of bugs.

In my case, suspected errors in linux library code have always been 
errors in my own code which surface as Gnu libraries are improved.

I am a library author myself and my goal in library design has always
been to make the library difficult to mis-use. Above all I did this
to reduce the amount of work I would have to do supporting my libraries.

Admittedly my libraries are far smaller than GTK and have far simpler
goals. However, I think all library designers should have Rusty Russel's
guide on API design titled "How Do I Make This Hard to Misuse?" :

    http://ozlabs.org/ Ìrusty/index.cgi/tech/2008-03-30.html

on hand whenever they are doing any API design work.

Erik
-- 
----------------------------------------------------------------------
Erik de Castro Lopo
http://www.mega-nerd.com/



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]