Отладка 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, отладчик сразу вернется, не ждет() предположим, чтобы приостановить до возвращения ребенка? Почему он немедленно возвращается?

Ответ 1

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

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

Debug view

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

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

Ответ 2

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

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

Ответ 3

  • В окне конфигурации отладки → Отладчик → Проверить "Автоматически отлаживать разветвленные процессы"
  • Открыть окно точки останова → Меню "Вид" → Добавить точку останова на событие C/С++ → "называемый"
  • Теперь, когда произошла точка останова события, нажмите F6 → вы увидите новый процесс в окне отладки
  • Выберите новый процесс и нажмите F6 - Вы находитесь у ребенка
  • Enjoy