stl map에서 segmentation fault가 납니다..

cb2531의 이미지

map<int,u_int64_t>::iterator i;
i = UM.find(atoi(f));
if (i != UM.end() && (*i).second != 0)
r.push_back((*i).second);

(다른 변수들의 속성은
map<int,u_int64_t> UM;
char *f;
vector<u_int64_t>& r; 입니다)

core파일 bt해보니깐 #3은 세번째 if줄이구요
나머지는 이렇습니다.

#0 0x0806a64f in std::less<int>::operator()(int const&, int const&) const (this=0xcccbb60, __x=@0x37373719, __y=@0x682fb908)
at /usr/include/c++/3.2/bits/stl_function.h:197
#1 0x080a0efc in std::_Rb_tree<int, std::pair<int const, unsigned long long>, std::_Select1st<std::pair<int const, unsigned long long> >, std::less<int>, std::allocator<std::pair<int const, unsigned long long> > >::find(int const&) (this=0xcccbb58, __k=@0x682fb908)
at /usr/include/c++/3.2/bits/stl_tree.h:1276
#2 0x080a009f in operator!=<std::pair<const int, u_int64_t>, std::pair<const int, u_int64_t>&, std::pair<const int, u_int64_t>*> (
__x=@0x682fb90c, __y=@0xcccbb58) at /usr/include/c++/3.2/bits/stl_tree.h:253

무조건 발생하는게 아니라 가끔 죽는거라서 이유를 잘 모르겠습니다
다른 곳에서 저 맵을 건드리는건지..락은 확실히 걸었는데 말이죠
여러분들의 조언을 구합니다..^^

eek의 이미지

thread를 사용중이시면

컴파일 하실때 -D_REENTRANT -D_PTHREADS 를 추가하고 컴파일 후 실행 하세요

Perl 만세~~~

익명 사용자의 이미지

eek wrote:
thread를 사용중이시면

컴파일 하실때 -D_REENTRANT -D_PTHREADS 를 추가하고 컴파일 후 실행 하세요

-D_THREAD_SAFE -D_REENTRANT 포함해서 컴파일 하고 있습니다 ... ^^

SoftOn의 이미지

http://www.bdsoft.com/tools/stlfilt.html
이거 한번 사용해 보시죠..
사용해 본적은 없는데. stl error 메세지를 해독해 주는 겁니다.. ^^

pynoos의 이미지

C++ debugging mode compile에서는

-fno-default-inline

옵션을 넣어주시는 것이 core dump 해석하는데 좋습니다. inline으로 되어 있으면 call stack에는 나와 있어도 inline되어 이상한 곳으로 가기 때문이죠.

그리고, 위 backtrace가 i386 아키텍쳐에서 하는 것이라면, this pointer가 heap도아니고 stack도 아닌것이 꽤 이상한 번지에 있는 것으로 보아 다른 곳에서 버퍼 오버플로우가 일어 난듯합니다.