Отладка 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