STL 할당시 메모리 에러

ohdol의 이미지

쓰레드를 세개 잡고 아래와 같이 역할 분담 시켰습니다.
아래 코드에 세그먼트 폴트라고 되어 있는 부분에서 가끔 프로그램이 죽어 버리는데.....왜 그런지 모르겠네요.
제가 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
IDNed의 이미지

솔직히 STL에 lock, unlock이 있는줄은 몰랏군요...
저런식으로 멀티스케쥴링을 지원하다니..
GCC만 그런거겠죠?

일단 전 단순히 msgQ.lock unlock을 별도의 뮤텍스로 보고 해석했는데
동기화쪽 오류는 없는거 같습니당..
동기화인줄 알고 한참 찾았는데 허탈하네요 -_-

하나 걸리는게 sock.read(sBuf) 부분인데...
BOF(버퍼오버플로우)일 가능성이 있어보입니다.

sock.read(sBuf);

sBuf가 넘쳐서 BOF 어택도 들어올 위험한 상황 -_-
반드시 버퍼 길이 검사를 하셔야...

익명 사용자의 이미지

흐 뮤텍스 동기화 인데 STL lock 처럼 표시 됐네요
소스를 다 쓰기 머해서 간추렸더니... :cry:

좀 의심이 가는 부분은 읽어서 넣어주고 버퍼는 초기화시키고
다른 쓰레드에서 팝시키면 deque에 들어있는 넘도 초기화 되는건가요?
넣을때 std:string 으로 strcpy가 일어나지 않나요?

deque<string> msgQ;
th_A
{
char sBuf[1024];
소켓 연결
while {
  memset(sBuf, 0x00, sizeof(sBuf));
  sock.read(sBuf);
  mutex.lock()
  msgQ.push_back(sBuf);
  mutex.unlock();  
} //end of while
} //end of th_A

th_B
{
while {
   string sMsg;
   mutex.lock();
   if(msgQ.size() > 0) 
   {
      sMsg = msgQ.front();     --> 세그먼트 폴트
      msgQ.pop_front();
   }
   mutex.unlock();
   if(sMsg.size() > 0)
   {
        Msg 파싱 및 기타 작업
   }  
} //end of while     ---> 세그먼트 폴트
} //end of th_B
IDNed의 이미지

아 에러가 거기서 나는 까닭을 알았습니다.

참조 : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcstdlib/html/vclrfvectorfront.asp
MSDN이긴 하지만 표준같아보입니다.

front()가 레퍼런스를 반환하네요...
그 말은 pop_front()시 무효한 게 될 수 있다는 겁니다.

IDNed의 이미지

말잘못.

front가 반환한 레퍼런스를 무효화할 수 있다는 겁니다.

IDNed의 이미지

음 생각해보니 아니군요 변수 sMsg가 레퍼런스가 아닌데.. ㅈㅅ

한번 BOF 부분좀 수정해보시구요...

front 함수는 팝시키지는 않습니다.

ohdol의 이미지

gdb를 실행해 보니 th_B() 의 while 문 바로 밑에서 아래와 같은 메세지를 뿌리고 죽네요.
std:string 에 문제가 있는거 같은데...먼지 잘 모르겠네요.
:cry:
in __gnu_cxx::__pool<true>::_M_reclaim_block ()
from /usr/lib/libstdc++.so.6

^^ always smile

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.