Могу ли я дать команду GDB запускать команды в ответ на SIGTRAP? - PullRequest
3 голосов
/ 22 сентября 2010

Я отлаживаю утечку ссылки в приложении на основе 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 не поддерживал это.)

Ответы [ 2 ]

5 голосов
/ 24 сентября 2010

Хотите показать некоторые значения и продолжить выполнение программы?В этом случае просто определите макрос, который отображает интересующие вас значения, продолжает выполнение и вызывает себя рекурсивно:

3 голосов
/ 23 сентября 2010

GDB не поддерживает его.

В общем, присоединение командного сценария к сигналу не имеет смысла - ваша программа может получать SIGTRAP в любом количестве мест, и команда не будет знать, пришел ли конкретный SIGTRAP в ожидаемом контексте или нет .

...