Linux -> HP-UNIX 포팅시 스레드 문제...
글쓴이: elbum / 작성시간: 화, 2009/06/16 - 7:40오후
리눅스에서 스레드소켓통신을 하는 프로그램을 개발했습니다.
리눅스에서는 잘 도는것을 확인하였는데
같은프로그램을 HP-UNIX 기반 서버에 넣고 컴파일을 하였습니다
스레드프로그램이라 옵션은 리눅스와 동일하게
cc -o 오브젝트 소스 -lpthread 를 주었는데
컴파일은 문제가없으나...
실행되면 메모리폴트가 나면서 코어파일이 생성됩니다.
1라인씩 디버그 로그를 찍었더니...
스레드 생성하는 부분에서 에러가 나더군요 (pthread_create)
어떻게 해결하나요? 네이년도 모르고 구글신도 모릅니다 -_-;;;
Forums:
좀 더 자세한 정보를 주셔야 할 것 같네요.
말씀하신 내용만으론 답변 드리기가 힘들 것 같네요.
그냥 일반론을 말씀드리자면, pthread_create에서 폴트가 나는 것은 드문일인데 pthread_create로 넘어가는 값들이 정확한 값들인지 확인해 보시고, 특히 컴파일러가 내보낸 경고 같은 것들을 잘보시라는 말씀밖엔...
더불어, 폴트가 나는 지점이 항상 그 부분의 잘못으로 폴트가 났다는 걸 의미하진 않으니 위에서 초기화가 잘 되었는지 메모리 침범은 없는지 등등 여러가지로 잘 살펴보시면 어떨까 합니다.
pthread_create를 하는 것을 보니 프로그램의 시작(초기화)부분인 것 같은데 살펴보실 내용이 그리 많지 않으리라 생각되네요.
GNU GCC 인가요??
아니라면 GNU GCC 환경으로 구성하시고 하시면 될듯 한데요
개인적인 경험으로는.
HPUX는 기본 stacksize가 리눅스보다 작습니다.(아마 8KiB 정도 였던걸로)
그래서 함수 등에서 local variable로 큰 메모리를 할당하면 (char buffer[16*1024 등)) 함수가 실행되는 순간 죽기도 합니다. 함수가 지나치게 많이 nested 호출되어서 넘어서는 경우는 확인하지 못했는데요, 동적할당으로 바꾸니 해결된 적이 있습니다. 또는, pthread의 attribute에서 할당 공간의 크기를 애초에 크게 잡는 방법도 있습니다.
ANSI C 컴파일러 깔린거 맞는지요
HP-UX는 ANSI C 컴파일러가 기본으로 깔려 있지 않습니다. 그 이전 버전의 C 컴파일러가 있죠...
혹시나 싶어서요.
SIGSEGV를 캐치해서,
SIGSEGV를 캐치해서, sigaction()을 써서 시그널 핸들러를 등록해보세요. 제 기억이 맞다면, SIGSEGV의 경우, stack overflow인지 아닌지 알려주는 정보가, siginfo_t에 있었던 것으로 기억합니다.
--
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://www.cinsk.org/cfaqs/
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
댓글 달기