GDB: Ctrl + C не прерывает процесс, как обычно, а скорее завершает программу
Обычно, когда вы запускаете программу через GDB, вы можете нажать Ctrl + C, чтобы прервать ее, например. если он застревает в бесконечном цикле, и вы хотите получить обратную трассировку.
Я отлаживаю программу (xmms2d, как это бывает), но только в этой программе, когда я нажимаю Ctrl + C, ее обрабатывают так, как если бы GDB не выполнялся - программа отключается чисто, а затем GDB сообщает мне, что программа завершена в нормальном режиме.
Как мне вернуть обычное поведение GDB, где Ctrl + C прерывает программу? Или есть другой способ произвести такую же реакцию в GDB, как обычно, Ctrl + C?
Ответы
Ответ 1
Готов поспорить, что xmms2d использует sigwait() для обработки сигналов, что ломает способность gdb ловить CTRL-C. См. https://bugzilla.kernel.org/show_bug.cgi?id=9039
У меня появилась идея обходного пути, прочитав Продолжить отладку после неудачного утверждения в Linux? - когда я готов разбить gdb, я запускаю "kill -TRAP <pid> " из другого терминала.
Ответ 2
В приглашении gdb вы можете "обрабатывать SIGINT stop", чтобы gdb ловил CTRL-C
Ответ 3
У меня была такая же проблема, вызванная обработчиками сигналов SDL, которые мешают gdb.
Одно решение, которое я нахожу для обхода этого при запуске gdb:
start
call sigignore(2)
continue
Теперь все CTRL-C будут игнорироваться приложением.
Если вы attach
для какого-то процесса и хотите восстановить его в исходное состояние после отладки, вы можете сделать это:
set $oldcallback = signal(2, 0)
call sigignore(2)
continue
И когда вы закончите:
call signal(2, $oldcallback)
detach
Ответ 4
Вы можете изменить цель ввода/вывода GDB, используя следующую команду:
gdb -tty = /dev/tty1