diff options
author | Matthias Clasen <mclasen@redhat.com> | 2013-12-02 21:48:03 -0500 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2013-12-02 21:48:03 -0500 |
commit | 28c2706da73d7dddb12d336b26a08218e761817c (patch) | |
tree | d8ba6c77f0d4757aa60a99706e9d096252a78ec4 | |
parent | 0f800cd1a863bc0c3e51c03592e2fb1ffbda8982 (diff) | |
download | glib-28c2706da73d7dddb12d336b26a08218e761817c.tar.gz |
Drop g_trap_object_ref debugging mechanism
This is really just a very crude and limited conditional breakpoint.
Update the documentation to explain conditional breakpoints in
gdb instead. Also, remove the link to refdbg, which appears dead.
https://bugzilla.gnome.org/show_bug.cgi?id=719687
-rw-r--r-- | docs/reference/gobject/tut_tools.xml | 21 | ||||
-rw-r--r-- | gobject/gobject.c | 12 |
2 files changed, 7 insertions, 26 deletions
diff --git a/docs/reference/gobject/tut_tools.xml b/docs/reference/gobject/tut_tools.xml index c8be945e0..5c6dd6eb7 100644 --- a/docs/reference/gobject/tut_tools.xml +++ b/docs/reference/gobject/tut_tools.xml @@ -73,24 +73,17 @@ The reference counting scheme used by GObject does solve quite a few memory management problems but also introduces new sources of bugs. In large applications, finding the exact spot where the reference count - of an Object is not properly handled can be very difficult. Hopefully, - there exist a tool named <ulink url="http://refdbg.sf.net/">refdbg</ulink> - which can be used to automate the task of tracking down the location - of invalid code with regard to reference counting. This application - intercepts the reference counting calls and tries to detect invalid behavior. - It supports a filter-rule mechanism to let you trace only the objects you are - interested in and it can be used together with GDB. + of an Object is not properly handled can be very difficult. </para> <para> - <indexterm><primary>g_trap_object_ref</primary></indexterm> - Note that if GObject has been compiled with <option>--enable-debug=yes</option>, - it exports a trap variable + A useful tool in debugging reference counting problems is to + set breakpoints in gdb on g_object_ref() and g_object_unref(). + Once you know the address of the object you are interested in, + you can make the breakpoints conditional: <programlisting> -static volatile GObject *g_trap_object_ref; +break g_object_ref if _object == 0xcafebabe +break g_object_unref if _object == 0xcafebabe </programlisting> - If set to a non-NULL value, <link linkend="g-object-ref">g_object_ref</link>() - and <link linkend="g-object-unref">g_object_unref</link>() will be intercepted - when called with that value. </para> </chapter> diff --git a/gobject/gobject.c b/gobject/gobject.c index 7f3403e42..1e37f4ae1 100644 --- a/gobject/gobject.c +++ b/gobject/gobject.c @@ -313,7 +313,6 @@ g_object_notify_queue_add (GObject *object, #ifdef G_ENABLE_DEBUG #define IF_DEBUG(debug_type) if (_g_type_debug_flags & G_TYPE_DEBUG_ ## debug_type) G_LOCK_DEFINE_STATIC (debug_objects); -static volatile GObject *g_trap_object_ref = NULL; static guint debug_objects_count = 0; static GHashTable *debug_objects_ht = NULL; @@ -3043,12 +3042,6 @@ g_object_ref (gpointer _object) g_return_val_if_fail (G_IS_OBJECT (object), NULL); g_return_val_if_fail (object->ref_count > 0, NULL); -#ifdef G_ENABLE_DEBUG - if (g_trap_object_ref == object) - G_BREAKPOINT (); -#endif /* G_ENABLE_DEBUG */ - - old_val = g_atomic_int_add (&object->ref_count, 1); if (old_val == 1 && OBJECT_HAS_TOGGLE_REF (object)) @@ -3075,11 +3068,6 @@ g_object_unref (gpointer _object) g_return_if_fail (G_IS_OBJECT (object)); g_return_if_fail (object->ref_count > 0); -#ifdef G_ENABLE_DEBUG - if (g_trap_object_ref == object) - G_BREAKPOINT (); -#endif /* G_ENABLE_DEBUG */ - /* here we want to atomically do: if (ref_count>1) { ref_count--; return; } */ retry_atomic_decrement1: old_ref = g_atomic_int_get (&object->ref_count); |