select()에서 core dump?????
계속해서 서비스중인 서버들이 비정기적으로
자꾸 주거사서 계속적으로 core파일을 봤지만..
계속 select()시에 자꾸나는거 같네요.. select에선 그런게 읍는걸루
아는데 --+
처음에 봤을때 poll에서 났는데 poll은 재가 안쓰니 --+
재가 알기론 select()가 poll을 사용하는걸로 알고 있어..
역시 select에서 에러 난듯 하구요..
이번에도 select에서 죽은거 같네여..
아 미치겠다.. gdb 메세지는 다음과 같습니다..
혹 보시고 충고해주실뿐은 꼭 충고해주시기 바랍니다..
GNU gdb 5.0rh-5 Red Hat Linux 7.1
Copyright 2001 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and
you are
welcome to change it and/or distribute copies of it under certain
conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for
details.
This GDB was configured as "i386-redhat-linux"...
Core was generated by `./LiveStudioStream'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /usr/lib/libreadline.so.3...done.
Loaded symbols for /usr/lib/libreadline.so.3
Reading symbols from /lib/i686/libm.so.6...done.
Loaded symbols for /lib/i686/libm.so.6
Reading symbols from /lib/i686/libpthread.so.0...done.
[New Thread 1024 (LWP 16896)]
Reading symbols from /lib/i686/libc.so.6...done.
Loaded symbols for /lib/i686/libc.so.6
Reading symbols from /lib/libtermcap.so.2...done.
Loaded symbols for /lib/libtermcap.so.2
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
Reading symbols from /lib/libnss_files.so.2...done.
Loaded symbols for /lib/libnss_files.so.2
Reading symbols from /usr/lib/gconv/EUC-KR.so...done.
Loaded symbols for /usr/lib/gconv/EUC-KR.so
Reading symbols from /usr/lib/gconv/libKSC.so...done.
Loaded symbols for /usr/lib/gconv/libKSC.so
#0 0x4015a90e in __select () from /lib/i686/libc.so.6
Re: select()에서 core dump?????
select, poll, read, write 등의 system call들이 core를 발생시키는
경우는 다음 2가지 정도입니다.
1. 사용된 fd가 -1일때.
2. 사용된 buff가 잘못된 번지일때.
위의 경우를 보면 짐작컨데, fd가 -1이 아닌가 하네요.
fd의 값을 확인하시는게 좋겠네요.
Re^2: select()에서 core dump?????
bsg wrote..
select, poll, read, write 등의 system call들이 core를 발생시키는
경우는 다음 2가지 정도입니다.
1. 사용된 fd가 -1일때.
2. 사용된 buff가 잘못된 번지일때.
위의 경우를 보면 짐작컨데, fd가 -1이 아닌가 하네요.
fd의 값을 확인하시는게 좋겠네요.
재가 알기론 그리고 테스트한바로는...
select, read, write같은 경우 fd가 -1인 경우
에러 리턴을 하는걸로 알고 있습니다.
즉 이경우는 아닌것이지요...
그렇다면 한가지 지금 집고 넘어가야 할 문제가..
select인 경우 (사용법이 타이머로 사용하였습니다.)
tv_sec 인 동안에 sleep해 있을때 어떤 signal이 오면은
이런 경우가 될까요??
(그런데 이경우 생각해봐도 select가 sleep해서 기다리는경우..
재가 알기론 -1을 리턴하여 에러 처리하는것으로 알고 있습니다.)
아 이게 지금 거의 몇개둴째 저의 머리를 아푸게 하네요..
원인이나 이유를 알아야 디버깅이 가능할텐데..
또는 특정 룰이 있어 프로세스가 종료되어야 할텐데..
이거 원 그런것두 읍써니 정말 미치겠네여..
Re: select()에서 core dump?????
저도 잘은 모르지만 core 를 발생시킨 시그날이 SIGSEGV 인걸 보니 사용하
시는 버퍼중에서 버퍼사이즈를 초과한 데이타를 사용해서 발생한것 같습니
다. select()에서 core 가 발생하는 이유는 보통 fd 는 select() 하기전
에 체크를 하는것이 보통이니까 제가 보기에는 버퍼오버플로우의 영향으
로 select()에서 core 가 발생한것 같습니다. 그리고 버퍼오버플로우시의
core 는 이미 메모리 영역이 깨진후의 dump file로 그 core 파일로는 아
마 찾기 힘드실것 같습니다.
Re^2: select()에서 core dump?????
흐음 아래에도 추가로 말씀드렸지만...
지금 select()는 timer기능으로 사용하기때문에
버퍼 오버플로어는 아닌거 같습니다..
그래서 재가 지금 원인을 찾지 못해서 전전긍긍하고 있지요 ㅠ.ㅠ
아무튼 답변 감사드립니다.
Re^3: select()에서 core dump?????
signal을 애기 했는데,
signal은 select시 -1을 return하고요,
errno = EINTR이 설정 됩니다.
ps 하나더.
multi-thread시 select중인 fd를 다른 thread에서 close해도
core가 발생 됩니다.
또한 어던 시점인지를 알려면, 방법은 있습니다.
SIGSEGV, SIGBUS signal을 잡아서 그때 어떤 부분이 수행중인지
위치를 파악한다면 도움이 되겠죠.
Re^4: select()에서 core dump?????
어떤 시점에서 segmenatation fault가 나는지 확인하기 위해서 전에 어떤
분이 올린 것 처럼 전역 변수를 잡아놓고 매 줄 사이에 라인번호를 매겼
던 기억이 있는데 그것 말고는 다른 방법이 있나요?
저도 select에서 가끔씩 죽는데
if (select () < 0)
if errno == EINTR continue;
이거면 인터럽트 처리는 다 된건지요?
즐거운 하루 되시기 바랍니다.
댓글 달기