Подтвердить что ты не робот

GDB: Ctrl + C не прерывает процесс, как обычно, а скорее завершает программу

Обычно, когда вы запускаете программу через GDB, вы можете нажать Ctrl + C, чтобы прервать ее, например. если он застревает в бесконечном цикле, и вы хотите получить обратную трассировку.

Я отлаживаю программу (xmms2d, как это бывает), но только в этой программе, когда я нажимаю Ctrl + C, ее обрабатывают так, как если бы GDB не выполнялся - программа отключается чисто, а затем GDB сообщает мне, что программа завершена в нормальном режиме.

Как мне вернуть обычное поведение GDB, где Ctrl + C прерывает программу? Или есть другой способ произвести такую ​​же реакцию в GDB, как обычно, Ctrl + C?

4b9b3361

Ответ 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