서버 프로그래밍시 세그먼트 폴트(쓰레드로 작성)
글쓴이: stypr / 작성시간: 수, 2003/10/01 - 10:25오전
GNU gdb Red Hat Linux (5.2-2) Copyright 2002 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 `./server'. Program terminated with signal 11, Segmentation fault. Reading symbols from /lib/i686/libpthread.so.0...done. Loaded symbols for /lib/i686/libpthread.so.0 Reading symbols from /usr/local/mysql/lib/mysql/libmysqlclient.so.10...done. Loaded symbols for /usr/local/mysql/lib/mysql/libmysqlclient.so.10 Reading symbols from /lib/i686/libc.so.6...done. Loaded symbols for /lib/i686/libc.so.6 Reading symbols from /usr/lib/libz.so.1...done. Loaded symbols for /usr/lib/libz.so.1 Reading symbols from /lib/libcrypt.so.1...done. Loaded symbols for /lib/libcrypt.so.1 Reading symbols from /lib/libnsl.so.1...done. Loaded symbols for /lib/libnsl.so.1 Reading symbols from /lib/i686/libm.so.6...done. Loaded symbols for /lib/i686/libm.so.6 Reading symbols from /lib/ld-linux.so.2...done. Loaded symbols for /lib/ld-linux.so.2 #0 0x4207afcc in chunk_free () from /lib/i686/libc.so.6 (gdb) bt #0 0x4207afcc in chunk_free () from /lib/i686/libc.so.6 #1 0x4207a70a in chunk_alloc () from /lib/i686/libc.so.6 #2 0x4207a158 in malloc () from /lib/i686/libc.so.6 #3 0x0804944d in serveIt () #4 0x4001ffaf in pthread_start_thread () from /lib/i686/libpthread.so.0 (gdb)
첫번째 접속해서 로그인 하면 제대로 이뤄지는데.. 로그아웃하고
두번째 접속해서 로그인 하면 로그인 하는 과정에서
세그먼트 폴트가 뜨네요
메모리 할당 해제 부분인데.. free쓴곳이 없는데...
부탁 드립니다.
core파일 첨부 할랬는데 524k 인데 안올라가네요 -_-;
Forums:
할당한후 free 한 메모리를 사용했을때만 세그먼트폴트가 나오는건 아니지
할당한후 free 한 메모리를 사용했을때만 세그먼트폴트가 나오는건 아니지요
원론적으로 할당되지 않은 메모리를 사용했을때 세그먼트폴트가 나오는거니깐
님께서는 사용하는 포인터 값이 가비지 값이던지 아니면 배열같은 것에서
할당한 사이즈를 초과해서 사용한게 아닐까요?
어쨌든 지금 상황은 소스에서 코딩에 실수가 있는 듯 하니
소스가 필요하네요.
어디쯤에서 나는지 확인해서 관련부분 소스를 일부 올려주셔야
대충이라도 짐작해 볼 수 있을 듯 하네요.
[code:1]login( char *ptr, int user
"Mysql 접속시작" 이라는 문구까지 나왔다가 세그먼트 폴트 뜹니다.
Mysql때문에 그런가 해서.. Mysql부분 다 없애고 무조건 참값인
return 1;
돌려주게 했는데도 .. 마찬가지로 세그먼트 폴트
처음 사용자는 모든게 정상적인데... 처음 사용자가 나가고
두번째 사용자가 들어오면 저런 현상이 발생합니다.
[quote]"Mysql 접속시작" 이라는 문구까지 나왔다가 세그먼트
Mysql 접속하는 부분을 잘 보시면 될것 같네요...
접속하는 부분을 아예 다 빼버려도 마찬가지로 에러가 떨어져요...
접속하는 부분을 아예 다 빼버려도 마찬가지로 에러가 떨어져요...
Mysql 접속 부분 빼고.. strace로 빼낸 결과 입니다[c
Mysql 접속 부분 빼고.. strace로 빼낸 결과 입니다
에러가 발생한 위치가 정확하지 않네요..올려놓으신 정보에 의하면
에러가 발생한 위치가 정확하지 않네요..
올려놓으신 정보에 의하면 "로그인 성공"을 출력한 후 시그널이 발생했군요..
아마도 buffer상의 내용이 화면에 출력되기 전에 에러가 발생했기때문이구요..
로그인 성공 이후의 문장을 확인하셔야 할듯..
추가적으로 printf 등을 이용해 에러발생위치를 찾으려면 매 printf 다음에 fflush를 써줘야 정확하게 알 수 있습니다..
^^;
드뎌 찾았습니다.pthread_create(&tid, NU
드뎌 찾았습니다.
pthread_create(&tid, NULL, (void*) &Admin, (void*) user_num);
생성하고 Admin이라는 함수내에서
malloc했다고 세그먼트 떨어진거였네요.
답만 얻었고 원인을 모르니..
원래 저안에서 포인터 가지고 놀면 안되나요?
저는 생성된 thread start routine 안에서 malloc 잘
저는 생성된 thread start routine 안에서 malloc 잘 사용하고 있습니다.
pthread_create(&tid, NULL, (void*) &Admin, (void*) user_num);
혹시 여기의 user_num값을 가지고 Admin 함수 내부에서 malloc 호출시에 사용하시나요?
저번에 저지른 어이없는 실수 였는데, pthread_create의 마지막 파라미터를 다음과 같은 방식으로 전달해놓고... 생성 thread의 start routine에서 사용하다가 오동작을 해서 한참 고민한 적이 있었습니다...
이런 문제는 아닐듯 싶지만 혹시나 해서... 참고하시라고 제 실수를 적어보았습니다. ^^
우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자
댓글 달기