Track the GTask
s which are still alive (not finalised) in a shared
list, and provide a secret debugging function for printing that list.
Too often when debugging apps, I have found that a ‘leaked’ object is
actually still (validly) referenced by an ongoing GTask
which hasn’t
completed for whatever reason. Or I have found that an operation has
obviously stalled, but there are no pointers available to the GTask
which is stalled, because it’s being tracked as a collection of closure
pointers from some GSource
which is hard to get to in the debugger.
It will be very useful for debugging apps, if there’s a list of all the
still alive GTask
s somewhere. This is that list.
The code is disabled if G_ENABLE_DEBUG
is not defined, to avoid every
GTask
construction/finalisation imposing a global locking penalty.
To use the new list, break in gdb
while running your app, and call
g_task_print_alive_tasks()
, or inspect the task_list
manually:
(gdb) print g_task_print_alive_tasks()
16:44:17:788 GLib-GIO 5 GTasks still alive:
• GTask 0x6100000ac740, gs_plugin_appstream_setup_async, ref count: 1, ever_returned: 0, completed: 0
• GTask 0x6100000bf940, [gio] D-Bus read, ref count: 2, ever_returned: 0, completed: 0
• GTask 0x6100000aac40, gs_plugin_loader_setup_async, ref count: 1, ever_returned: 0, completed: 0
• GTask 0x61000006d940, gs_plugin_loader_job_process_async GsPluginJobRefine, ref count: 1, ever_returned: 0, completed: 0
• GTask 0x610000118c40, [gio] D-Bus read, ref count: 2, ever_returned: 0, completed: 0
Signed-off-by: Philip Withnall pwithnall@endlessos.org