2009-12-07 5 views
0

나는 C의 기본 셸에서 작업하고있다. pipes을 구현 한 결과 나는 회선의 명령을 반복 계산하고 반복적으로 fork()의 새 프로세스를 계산한다.신호 11 segfault on wait() 시스템 호출?

다음 명령으로 진행하기 전에 각 반복의 끝에서 I wait()을 자식으로 처리하십시오. 이는 이전 코드에서 잘 작동했지만, 어떻게 든 그것을 파괴했습니다

Program terminated with signal 11, Segmentation fault. 
#0 0xfef28730 in _waitpid() from /usr/lib/libc.so.1 

(gdb) backtrace 
#0 0xfef28730 in _waitpid() from /usr/lib/libc.so.1 
#1 0xfef28770 in _wait() from /usr/lib/libc.so.1 
#2 0xfef696d1 in wait() from /usr/lib/libc.so.1 
#3 0x08051428 in main() 

나는 아이가 이미 종료 된 경우 wait() 단순히 좀비 프로세스를 얻을 것이라는 점을 이해합니다.

왜, 어떤 경우에 wait()이 segfault를 발생 시킬까요? 어떻게 이런 종류의 디버깅을 할 수 있습니까?

+0

단일 스레드 응용 프로그램입니까? –

답변

1

wait (2)에 대한 status 인수에 대해 유효하지 않은 포인터를 전달한 것 같습니다.

이런 종류의 디버깅 방법은 내 첫 번째 단계는 C 라이브러리의 디버깅 기호를 설치하는 것입니다. 그런 다음 오류가 발생한 포인터를 살펴보고 가능한 경우 스택을 백업합니다.

1

wait()를 호출하는 인수를 살펴보고 메모리 덮어 쓰기 문제도 찾습니다. Valgrind을 통해 프로그램을 실행하면 많은 덮어 쓰기를 매우 쉽게 감지 할 수 있습니다.