Проблема здесь в том, что GDB использует SIGINT
в качестве механизма прерывания программы и позволяет вам начать отладку.
(gdb) info signals SIGINT
Signal Stop Print Pass to program Description
SIGINT Yes Yes No Interrupt
Это говорит о том, что GDB не должен передавать SIGINT
s в программа, но следует использовать это, чтобы остановить программу и вывести вас в приглашение GDB. Самый простой механизм отправки его в вашу программу - это послать сигнал от GDB в этот момент:
(gdb) signal SIGINT
Теперь ваша программа должна продолжить работу, как ожидалось.
В зависимости от того, как часто вы делаете это, ввод signal SIGINT
может быть неудобным. К счастью, GDB позволяет вам изменить способ обработки сигналов . Вы хотите, чтобы SIGINT
не останавливал программу (перетянул вас в приглашение GDB) и передавал ее программе.
(gdb) handle SIGINT nostop pass
SIGINT is used by the debugger.
Are you sure you want to change it? (y or n) y
Signal Stop Print Pass to program Description
SIGINT No Yes Yes Interrupt
Теперь мы находимся в стране "слегка нежелательной", поскольку больше не может использовать Ctrl + C, чтобы перейти в нашу подсказку GDB. Вам придется полагаться на предустановленные точки останова и другие механизмы.
Если вы хотите получить более продвинутый уровень, вы можете использовать catch
и commands
, чтобы определить источник SIGINT
(взято из Отладка программы, которая использует SIGINT с gdb ):
catch signal SIGINT
commands
if $_siginfo._sifields._kill.si_pid == 0
print "Received SIGINT from tty"
else
printf "Received SIGINT from %d; continuing\n", $_siginfo._sifields._kill.si_pid
signal SIGINT
end
end