Отладка fork () в eclipse cdt

Я пытаюсь отладить некоторый механизм fork () с eclipse cdt (Juno). Я написал программу в C.

if( -1 == (pid = fork()) ) /* error */ goto cleanup; else if ( 0 == pid ) /* child */ { execlp("gcc", "gcc", cFilePath, "-o" , GCC_OUTPUT_FILE_NAME, NULL); goto cleanup; /* Arrives here only on error! */ } else if (pid > 0) /* parent - checks: correct pid returns, returns normally, with exit status = 0*/ { returnedpid = wait(exitStatus); if( pid != returnedpid || exitStatus == NULL || !WIFEXITED(*exitStatus) || !WEXITSTATUS(*exitStatus) ) goto cleanup; } 

Я попытался добавить « set follow-fork-mode child », как сказано здесь: http://unix.derkeiler.com/Newsgroups/comp.unix.programmer/2006-02/msg00435.html

1. Как я могу отлаживать раздел кода, где (0==pid) ?

2. Когда я получаю оператор wait, отладчик сразу возвращается, не ждет (), чтобы приостановить до возвращения ребенка? Почему он немедленно возвращается?

Вероятно, ваши проблемы связаны с отключением «отсоединения на fork». DSF устанавливает это по умолчанию (это также по умолчанию gdb).

1) Поместите точку останова на строки с «execlp …» и «comepid = …». 2) В конфигурации отладки разрешить «режим без остановок» и «автоматически отлаживать разветвленный процесс». 3) Запустите сеанс отладки. Вы попадете в точку останова либо в дочернем, либо в родительском. Теперь см. Отчет об отладке.

Просмотр отладки

Вы заметите, что ваши двоичные файлы показывают два streamа.

4) Нажмите на один или другой (строки с основным () на изображении выше), чтобы переключить контекст отладки.

Возможно, это связано с тем, что процесс init забирает ребенка, прежде чем ждать. Попробуйте блокировать sigchld при входе в вилку, а затем разблокировать сигналы после ваших forks / execs. Возможно, это должно дать вам представление о том, что именно происходит.

Использование sigprocmask должно помочь вам.

  1. В окне конфигурации отладки -> Отладчик -> Проверить «Автоматически отлаживать разветвленные процессы»
  2. Открытое окно точки останова -> Меню «Вид» -> Добавить точку останова Event C / C ++ -> «fork called”
  3. Теперь, когда произошла точка останова события, нажмите F6 -> вы увидите новый процесс в окне отладки
  4. Выберите новый процесс и нажмите F6. Вы находитесь у ребенка.
  5. наслаждаться