2011-04-24 7 views
1

내 프로젝트는 대부분의 UNIX 셸에서와 마찬가지로 &으로 arglist를 끝내는 방법으로 백그라운드 처리로 간단한 쉘 프로그램을 구현하는 것입니다. 내 문제는 백그라운드 처리가 자식 프로세스를 생성해야 할 때 GDB에서 셸을 디버깅하는 방법이다. 내가 추신 &과 같은 명령을 실행하고 기능 파서에 중단 점을 설정하려고하면자식 프로세스 디버깅 -GDB/DDD

자녀 처리 코드가

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); 
} 

처럼 간다,이 명령은 중단 점을 타격하지 않고 실행합니다. 이것은 혼란스럽고이 경우 디버거를 쓸모 없게 만듭니다. 그것에 대해 무엇을 할 수 있습니까?

답변

1

난 당신이

set follow-fork-mode child 

또한 라인

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

()는 포크의 반환 값에 초기화되지 않은 값을 비교되어 있습니다 싶은 생각합니다. 나는 당신이 과제를 원한다고 생각합니다.

+0

두 번째 오류는 내 오류이지만 첫 번째 오류는 무엇을 의미합니까? – Jason

+0

@jason gdb 명령 'set follow-fork-mode'는 gdb가 포크를 만났을 때 gdb가 디버깅을 계속할 측, 부모 측 또는 자식 측을 처리하도록 지시합니다. – matt

+0

설명해 주셔서 감사합니다. – Jason

관련 문제