2009-03-19 1 views
1

나는 2 MiB 정도의 꽤 무거운 스택 할당을 한 C 프로그램을 작성했다. 나는 가난한 사람의 IDE를 사용하기 때문에 컴파일 할 때마다 테스트를 위해 make를 통해 자동으로 프로그램을 실행하고있었습니다.프로그램은 make에 의해 실행될 때 실행되지만 쉘을 통해 실행되지는 않습니다 - 말도 안되는 넌센스!

나는 거의 모든 것을 감쌌지만, 어떤 이유로 최종 최적화 과정에서 쉘에서 직접 실행했습니다. 즉시 segfault! make로 계속 실행하면 손으로 실행하면 항상 동일한 segfault가 생성됩니다.

결국 256 KiB로 스택 할당량을 줄여서 문제를 해결했습니다. 내 합리적인 것은 make가 아마도 프로세스를 실행하고 있었기 때문에 더 많은 스택 공간을 사용할 수있는 이상한 매개 변수를 상속 받았다는 것입니다.

모든 것이 이제 괜찮지만 내 이론을 테스트 할 방법이 없습니다. 누구나 확인하거나 거부 할 수 있습니까, 아니면 테스트 방법을 제안 할 수 있습니까?

* zsh을, 정력, GCC, GDB, 일부 열매 메이크

답변

5
당신은 ulimit(1)와 최대 스택 크기를 설정하는 시도하고 작동하는지 볼 수 있습니다

:

# Limit stack to 1024 KiB 
ulimit -s 1024; ./myprogram 
# Now no limit 
ulimit -s unlimited; ./myprogram 
+0

그래, 그랬어! 그것은 'ulimit -s 무제한'이후 쉘에서 직접 작동했습니다. 사람, 성숙한 만들기 프로그램의 경우 다소 심각한 버그처럼 보입니다. (나는 gmake 3.81을 사용하고있다.) 그들에게 친숙한 이메일을 쓰겠다고 생각한다. :-) –

+0

make의 버그 밖에 없다고 생각하지 않는다. make는 아마 high로 설정했다. 무제한) 가치를 부여하며 이는 하위 프로세스에 의해 상속받습니다. – paxdiablo

+0

@pax가 동의했습니다. 그러나 자식 프로세스가 상속하는 환경을 변경하는 것은 여전히 ​​버그입니다. 사람들은 항상 '시험하다'와 같은 일을하고, 그들이 무엇을해도 영향을 미치지 않는다는 사실을 기대합니다. –

0

더 많은 정보는 진단이 필요하다 이. 즉, 사용하고있는 makefile과 쉘 스크립트를 보는 것이 좋을 것이다.

1

개인적으로, 내 첫 번째 단계는 코드에서 segfault가 발생한 위치, 즉 gdb 또는 디버그 printf 또는 기타와 같은 위치를 찾으려는 것입니다. (이것은 malloc의 리턴 값을 항상 체크하는 이유이며, segfaults의 가능한 소스를 줄입니다 .-p) 문제의 정확한 원인을 발견하면 스택 할당에 대한 이론을 입증 할 수 있습니다. 또한 segfaulting이 아닌 유익한 오류 메시지로 프로그램을 정상적으로 종료 할 수 있도록 오류 검사 코드를 삽입 할 수 있습니다.

관련 문제