Отладка дочерних процессов - GDB / DDD - PullRequest
1 голос
/ 24 апреля 2011

Мой проект состоит в том, чтобы реализовать простую программу оболочки с фоновой обработкой, заканчивая arglist символом &, как в большинстве оболочек UNIX.Моя проблема заключается в том, как отлаживать оболочку в GDB, когда фоновая обработка требует создания дочерних процессов.

Мой дочерний код обработки выглядит так:

int id;
int child=-1;
int running=0;

if ((strcmp(args[0], "&")==0){

  if ((id==fork())==-1)
    perror("Couldn't start the background process");

  else if (id==0){  //start the child process
    running++;
    printf("Job %d started, PID: %d\n", running, getpid());
    signal(SIGINT, SIG_DFL);
    signal(SIGQUIT, SIG_DFL);
    execvp(args[0], args);
    perror("Can't execute command);
    exit(1);

  else {
    int jobNum= running-(running-1);

   if ( (waitpid(-1, &child, WNOHANG) == -1)
     perror("Child Wait");

   else 
     printf("[%d] exited with status %d\n", jobNum, child>>8);
}

Когда я пытаюсь выполнить команду, напримерps &, и установите точку останова для синтаксического анализатора функции, команда выполняется без попадания в точку останова.Это сбивает с толку и делает отладчик бесполезным в этом случае.Что я могу с этим поделать?

1 Ответ

1 голос
/ 24 апреля 2011

Я думаю, что вы хотите

set follow-fork-mode child

и обратите внимание, что строка

if ((id==fork())==-1)

сравнивает неинициализированное значение с возвращаемым значением fork ().Я полагаю, вы хотели назначить.

...