summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2013-12-02 21:48:03 -0500
committerMatthias Clasen <mclasen@redhat.com>2013-12-02 21:48:03 -0500
commit28c2706da73d7dddb12d336b26a08218e761817c (patch)
treed8ba6c77f0d4757aa60a99706e9d096252a78ec4
parent0f800cd1a863bc0c3e51c03592e2fb1ffbda8982 (diff)
downloadglib-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.xml21
-rw-r--r--gobject/gobject.c12
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);