Gdb отладка дочернего процесса после fork (настроен дочерний режим в режиме ожидания)

Я разрабатываю приложение, которое родительское создает для дочерних элементов для выполнения определенных задач. У меня возникла проблема, когда я настроил gdb на дочерний режим следующего режима, но после fork после достижения точки останова он отправляет SIGTRAP, но ребенок каким-то образом завершает работу и отправляет SIGCHLD родительскому объекту.

Я сконфигурировал signal(SIGTRAP, SIG_IGN) перед fork, поэтому я понимаю, что ребенок должен наследовать и игнорировать SIGTRAP, когда точка останова достигнута, но этого не происходит.

Пожалуйста, помогите мне понять это, если я ошибаюсь.

Как я могу успешно отладить дочерний процесс?

Ответ 1

Дочерний процесс наследует обработчики сигналов от родителя, но не отложенный сигнал.

После форкирования попробуйте установить обработчик сигнала для SIGTRAP в месте в коде, где дочерний процесс выполняется после форкирования. Если вы не обрабатываете SIGTRAP, действие по умолчанию состоит в том, что дочерний элемент завершен.

Если вы хотите отлаживать дочерний процесс, вы должны использовать follow-fork-mode. Вы должны установить режим, используя

set follow-fork-mode child

Однако теперь можно отлаживать только дочерний элемент, а родительский флажок не установлен.

Существует еще один грязный способ отладки дочернего процесса.

После выполнения fork() поместите вызов sleep() в код, в котором выполняется дочерний процесс, получите PID дочернего элемента с помощью утилиты ps, затем добавьте PID.

attach <PID of child process>

Теперь вы можете отлаживать дочерний процесс, как и любой другой процесс.

После отладки вы можете отсоединить PID, используя

detach