2017-02-03 17 views
0

То, что я пытаюсь сделать, - это развить процесс, выполнить новый исполняемый файл в дочернем процессе, разрешить родительскому процессу завершать и присоединять к дочернему процессу GDB для отладки этого дочернего процесса. Причина, по которой я использую исходный родительский процесс для вилки дочернего процесса (отлаживаемого), заключается в том, что я хочу установить некоторые свойства среды для этого дочернего процесса, который требует некоторых системных вызовов в ядре linux и не хочет изменять GDB для этого , Я попробовал и обнаружил, что могу подключиться к дочернему процессу через GDB после завершения родительского процесса, но в этом случае ребенок уже работает после системного вызова exec(). Проблема в том, что я не могу использовать ptrace (PTRACE_TRACEME) для дочернего элемента, что приводит к его остановке с первой инструкцией, потому что в этом случае GDB не может прикрепляться к ней, поскольку она уже прослеживается ее родителем. Как остановить дочерний процесс после настройки его среды, чтобы он был остановлен при первой инструкции, когда я выполняю exec()?Как остановить дочерний процесс при первой инструкции только что выполненной программы после exec()?

ответ

0

Я понял способ, который выполнил мою потребность, и я отправляю его, поскольку это может быть полезно кому-то другому. После форкирования, настроив необходимую среду, перед выполнением отлаживаемой программы отправьте сигнал останова на себя {kill (getpid(), SIGSTOP)}. Пусть родитель не ждет дочерний процесс и завершает работу. Так что есть только один pid. Откройте GDB, присоедините к нему, используя «gdb -p pid». Сигнал останова будет доставлен в GDB. Продолжайте процесс, указав команду sig 0 в приглашении GDB. Детский процесс будет продолжен и последует выполнение отлаживаемой программы, и вы можете отлаживать его нормально сейчас.