Я отлаживаю утечку ссылки в приложении на основе GObject. GObject имеет простой встроенный механизм для решения таких вопросов: вы можете установить переменную g_trap_object_ref
в gobject.c для объекта, который вам нужен, и тогда каждый ref или unref этого объекта будет попадать в инструкцию точки останова (через G_BREAKPOINT()
).
Так что, конечно, программа останавливается с отчетом GDB:
Program received signal SIGTRAP, Trace/breakpoint trap.
g_object_ref (_object=0x65f090) at gobject.c:2606
2606 old_val = g_atomic_int_exchange_and_add ((int *)&object->ref_count, 1);
(gdb) _
, что является отличным началом. Теперь, как правило, я пишу некоторые команды для запуска в точке останова, которую я вручную устанавливаю с помощью commands 3
(скажем, для точки останова 3). Но эквивалент SIGTRAP
, а именно handle SIGTRAP
, не дает мне возможности делать что-то особенно интересное. Есть ли хороший способ сделать это?
(Я знаю, что есть другие способы отладки утечек ссылок, такие как установка точек наблюдения в поле ref_count
объекта, refdbg, создание сценариев регулярных точек останова на g_object_ref()
и g_object_unref()
. Я собираюсь идти попробуйте сейчас. Я специально ищу способ написать ответ на SIGTRAP
. Он может пригодиться и в других ситуациях, и я был бы удивлен, если бы gdb не поддерживал это.)