STL 할당시 메모리 에러
글쓴이: ohdol / 작성시간: 목, 2006/01/26 - 6:02오후
쓰레드를 세개 잡고 아래와 같이 역할 분담 시켰습니다.
아래 코드에 세그먼트 폴트라고 되어 있는 부분에서 가끔 프로그램이 죽어 버리는데.....왜 그런지 모르겠네요.
제가 string 처리를 잘못하고 있는건지...?
deque에서 front() 해 올때도 size 체크하면 0보다 큰데 거기서도 가끔 죽고 왜 그런지...?
th_A - 소켓에서 읽는 쓰레드
th_B - 읽은 스트링 파싱하는 쓰레드
th_C - DB 작업 쓰레드
deque<string> msgQ; th_A { char sBuf[1024]; 소켓 연결 while { sock.read(sBuf); msgQ.lock() msgQ.push_back(sBuf); msgQ.unlock(); } //end of while } //end of th_A th_B { while { string sMsg; msgQ.lock(); if(msgQ.size() > 0) { sMsg = msgQ.front(); --> 세그먼트 폴트 msgQ.pop_front(); } msgQ.unlock(); if(sMsg.size() > 0) { Msg 파싱 및 기타 작업 } } //end of while ---> 세그먼트 폴트 } //end of th_B
Forums:
솔직히 STL에 lock, unlock이 있는줄은 몰랏군요...저런식
솔직히 STL에 lock, unlock이 있는줄은 몰랏군요...
저런식으로 멀티스케쥴링을 지원하다니..
GCC만 그런거겠죠?
일단 전 단순히 msgQ.lock unlock을 별도의 뮤텍스로 보고 해석했는데
동기화쪽 오류는 없는거 같습니당..
동기화인줄 알고 한참 찾았는데 허탈하네요 -_-
하나 걸리는게 sock.read(sBuf) 부분인데...
BOF(버퍼오버플로우)일 가능성이 있어보입니다.
sock.read(sBuf);
sBuf가 넘쳐서 BOF 어택도 들어올 위험한 상황 -_-
반드시 버퍼 길이 검사를 하셔야...
Re: STL 할당시 메모리 에러
흐 뮤텍스 동기화 인데 STL lock 처럼 표시 됐네요
소스를 다 쓰기 머해서 간추렸더니... :cry:
좀 의심이 가는 부분은 읽어서 넣어주고 버퍼는 초기화시키고
다른 쓰레드에서 팝시키면 deque에 들어있는 넘도 초기화 되는건가요?
넣을때 std:string 으로 strcpy가 일어나지 않나요?
아 에러가 거기서 나는 까닭을 알았습니다.참조 : http://m
아 에러가 거기서 나는 까닭을 알았습니다.
참조 : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcstdlib/html/vclrfvectorfront.asp
MSDN이긴 하지만 표준같아보입니다.
front()가 레퍼런스를 반환하네요...
그 말은 pop_front()시 무효한 게 될 수 있다는 겁니다.
말잘못.front가 반환한 레퍼런스를 무효화할 수 있다는 겁니다.
말잘못.
front가 반환한 레퍼런스를 무효화할 수 있다는 겁니다.
음 생각해보니 아니군요 변수 sMsg가 레퍼런스가 아닌데.. ㅈㅅ
음 생각해보니 아니군요 변수 sMsg가 레퍼런스가 아닌데.. ㅈㅅ
한번 BOF 부분좀 수정해보시구요...
front 함수는 팝시키지는 않습니다.
gdb를 실행해 보니 th_B() 의 while 문 바로 밑에서 아래와
gdb를 실행해 보니 th_B() 의 while 문 바로 밑에서 아래와 같은 메세지를 뿌리고 죽네요.
std:string 에 문제가 있는거 같은데...먼지 잘 모르겠네요.
:cry:
in __gnu_cxx::__pool<true>::_M_reclaim_block ()
from /usr/lib/libstdc++.so.6
^^ always smile
댓글 달기