2012-09-20 2 views
0

서버 응용 프로그램이 코드에서 항상 같은 줄에서 충돌합니다. 나는 문제를 찾기 위해 GDB와 Valgrind의 사용하지만, 충돌 지점이 컴파일러 생성 소멸에있는 것, 그리고이 Valgrind의이 말씀입니다 :소멸자 함수가 실행될 때 서버 응용 프로그램이 항상 충돌합니다.

==27785== Invalid read of size 8 
==27785== at 0x5CDCE25: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string() (in /usr/lib64/libstdc++.so.6.0.8) 
==27785== by 0x5812F4: Pet::BookConfiguration::~BookConfiguration() (BookConfiguration.h:8) 
==27785== by 0x5EDEC4: void std::_Destroy<Pet::BookConfiguration>(Pet::BookConfiguration*) (stl_construct.h:107) 
==27785== by 0x5EDEE2: void std::__destroy_aux<Pet::BookConfiguration*>(Pet::BookConfiguration*, Pet::BookConfiguration*, __false_type) (stl_construct.h:12 
2) 
==27785== by 0x5EDF17: void std::_Destroy<Pet::BookConfiguration*>(Pet::BookConfiguration*, Pet::BookConfiguration*) (stl_construct.h:155) 
==27785== by 0x5EDF3A: void std::_Destroy<Pet::BookConfiguration*, Pet::BookConfiguration>(Pet::BookConfiguration*, Pet::BookConfiguration*, std::allocator 
<Pet::BookConfiguration>) (stl_construct.h:182) 
==27785== by 0x5F5C09: std::vector<Pet::BookConfiguration, std::allocator<Pet::BookConfiguration> >::~vector() (stl_vector.h:272) 
==27785== by 0x5F6A22: Pet::ShopModel::~ShopModel() (ShopModel.h:15) 
==27785== by 0x5C59E3: Pet::PetProcessor::climbFight(Pet::SourceList&, Pet::TBuffer&) (PetProcessor.cpp:1796) 
==27785== by 0x589263: Pet::Processor::execute(Pet::SourceList&, unsigned short, Pet::TBuffer&) (Processor.cpp:22) 
==27785== by 0x578627: Pet::JobThread<Pet::PetProcessor>::run() (JobThread.h:66) 
==27785== by 0x4F81AB2: Poco::PooledThread::run() (in /data/home/app100619699/pet_srv/lib/libPocoFoundation.so.11) 
==27785== Address 0x900df30 is 7 bytes after a block of size 57 free'd 
==27785== at 0x4A201B6: operator delete(void*) (vg_replace_malloc.c:457) 
==27785== by 0x5CDCE59: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string() (in /usr/lib64/libstdc++.so.6.0.8) 
==27785== by 0x5CFFE6: Pet::PetProcessor::getUserBag(Pet::SourceList&, Pet::TBuffer&) (PetProcessor.cpp:446) 
==27785== by 0x589263: Pet::Processor::execute(Pet::SourceList&, unsigned short, Pet::TBuffer&) (Processor.cpp:22) 
==27785== by 0x578627: Pet::JobThread<Pet::PetProcessor>::run() (JobThread.h:66) 
==27785== by 0x4F81AB2: Poco::PooledThread::run() (in /data/home/app100619699/pet_srv/lib/libPocoFoundation.so.11) 
==27785== by 0x4F7D1D5: Poco::ThreadImpl::runnableEntry(void*) (in /data/home/app100619699/pet_srv/lib/libPocoFoundation.so.11) 
==27785== by 0x54DE192: start_thread (in /lib64/libpthread-2.4.so) 
==27785== by 0x6161F0C: clone (in /lib64/libc-2.4.so) 

아무런 관계가 없으며, 그들은 모두 여기에 언급 된 두 개의 문자열 지역 변수. 왜 그런 일이 발생했는지 또는 실제 충돌 문제를 어떻게 알 수 있습니까?

Pet::BookConfiguration::~BookConfiguration()은 컴파일러에서 생성 한 소멸자입니다. 이 클래스에는 공개 할 리소스가 없으므로 아무 것도 할 필요가 없습니다.

+0

'~ BookConfiguration()'에서는 어떤 일이 발생합니까? – verdesmarald

+1

Pet :: BookConfiguration :: ~ BookConfiguration()은 컴파일러가 생성 한 소멸자입니다. 이 클래스에는 공개 할 리소스가 없기 때문에주의해야합니다. – user1400047

+1

[SSCCE] (http://sscce.org)를 만들 수 있습니까? – oldrinb

답변

1

오류 메시지에서 스레드와 일부 유형의 공유 저장 영역 풀을 분명히 사용하고 있습니다. 두 개의 서로 다른 스레드가 서버를 종료 할 때 공유 리소스를 파괴하려고 시도하고 공유 객체를 두 번 삭제하면 정의되지 않은 동작이므로 두 번째 스레드가 충돌 조건을 생성하는 문제가 발생할 수 있습니다.

두 개의 개별 스레드가 실제로 동일한 공유 오브젝트를 사용할 필요는 없지만 하나의 스레드가 다른 스레드가 객체를 사용중인 풀을 삭제하면 두 번째 스레드는 풀의 해당 객체를 삭제할 수 없습니다 첫 번째 스레드가 이미 해당 자원을 파괴했기 때문입니다. 따라서 시퀀싱 문제, 스레드 리소스 간의 소유권 문제 또는 둘 모두의 조합을 가질 수 있습니다.

+0

하지만 내 프로그램에서 견인 스레드는 쓰기 가능한 객체를 공유하지 않습니다. – user1400047

관련 문제