Crash w std::list podczas clear

0

Witam.

Piszę tutaj ponieważ mam problem z pewnym crashem podczas clear() w std::list

Mianowicie mam funkcje

void OutputMessagePool::sendAll()
{
	boost::recursive_mutex::scoped_lock lockClass(m_outputPoolLock);
	OutputMessageList::iterator it;
	for(it = m_addQueue.begin(); it != m_addQueue.end();)
	{
		//drop messages that are older than 10 seconds
		if(OTSYS_TIME() - (*it)->getFrame() > 10000)
		{
			if((*it)->getProtocol())
				(*it)->getProtocol()->onSendMessage(*it);

			it = m_addQueue.erase(it);
			continue;
		}

		(*it)->setState(OutputMessage::STATE_ALLOCATED);
		m_autoSend.push_back(*it);
		++it;
	}

	m_addQueue.clear();
	OutputMessageList* m_toSendMessages = new OutputMessageList(); 

	for(it = m_autoSend.begin(); it != m_autoSend.end();)
	{
		OutputMessage_ptr omsg = (*it);
		if(omsg->size() > 1024 || (m_frameTime - omsg->getFrame() > 10))
		{
			if(omsg->getConnection() && omsg->getProtocol())
				omsg->getProtocol()->resetMsg();
			m_toSendMessages->push_back(omsg);
			it = m_autoSend.erase(it);
		}
		else
			++it;
	}

	if(!m_toSendMessages->empty())
		Tasker::getInstance().addTask(createTask(boost::bind(&OutputMessagePool::autoSendThread, this, m_toSendMessages)));
	else
		delete m_toSendMessages;
}

Ważne w niej informacje:
OutputMessageList to typedef std::list<OutputMessage_ptr> OutputMessageList;
OutputMessage_ptr to typedef boost::shared_ptr<OutputMessage> OutputMessage_ptr;
OutputMessage to class OutputMessage : public NetworkMessage, boost::noncopyable
Tasker to inny wątek.
Cały plik nagłówkowy jest dostępny tutaj - http://pastebin.com/raw.php?i=ssNify8q

Crash następuje w funkcji autoSendThread

void OutputMessagePool::autoSendThread(OutputMessageList *m_toSendMessagesNow)
{
	if(m_toSendMessagesNow) {
		for(OutputMessageList::iterator it = m_toSendMessagesNow->begin(); it != m_toSendMessagesNow->end(); ++it)
		{
			OutputMessage_ptr omsg = (*it);
			if(omsg->getConnection())
			{
				if(!omsg->getConnection()->send(omsg) && omsg->getProtocol())
					omsg->getProtocol()->onSendMessage(omsg);
			}
		}
		m_toSendMessagesNow->clear();
		delete m_toSendMessagesNow;
	}
}

Podczas (co ciekawe) m_toSendMessagesNow->clear(); Występuje on po kilku godzinach działania aplikacji, w tym czasie funkcja ta zostaje wywołana kilkanaście tysięcy razy.

Pełny log
[code]#0 0x0000000091480590 in ?? ()
#1 0x000000000044a5b9 in boost::detail::sp_counted_base::release (
this=<value optimized="optimized" out="out">, __in_chrg=<value optimized="optimized" out="out">)
at /usr/include/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp:145
#2 ~shared_count (this=<value optimized="optimized" out="out">, __in_chrg=<value optimized="optimized" out="out">)
at /usr/include/boost/smart_ptr/detail/shared_count.hpp:217
#3 0x000000000058a65f in ~shared_ptr (this=<value optimized="optimized" out="out">,
m_toSendMessagesNow=0x7fbf30a50660)
at /usr/include/boost/smart_ptr/shared_ptr.hpp:168
#4 __gnu_cxx::new_allocator<boost::shared_ptr<OutputMessage> >::destroy (
this=<value optimized="optimized" out="out">, m_toSendMessagesNow=0x7fbf30a50660)
at /usr/include/c++/4.6/ext/new_allocator.h:118
#5 std::_List_base<boost::shared_ptr<OutputMessage>, std::allocator<boost::shared_ptr<OutputMessage> > >::_M_clear (this=<value optimized="optimized" out="out">,
---Type <return> to continue, or q <return> to quit---
m_toSendMessagesNow=0x7fbf30a50660)
at /usr/include/c++/4.6/bits/list.tcc:78
#6 std::list<boost::shared_ptr<OutputMessage>, std::allocator<boost::shared_ptr<OutputMessage> > >::clear (this=<value optimized="optimized" out="out">,
m_toSendMessagesNow=0x7fbf30a50660)
at /usr/include/c++/4.6/bits/stl_list.h:1197
#7 OutputMessagePool::autoSendThread (this=<value optimized="optimized" out="out">,
m_toSendMessagesNow=0x7fbf30a50660) at outputmessage.cpp:231
#8 0x000000000049e2c8 in boost::function0<void>::operator() (
this=<value optimized="optimized" out="out">)
at /usr/include/boost/function/function_template.hpp:1013
#9 Task::operator() (this=<value optimized="optimized" out="out">) at dispatcher.h:34
#10 0x000000000049c270 in Tasker::taskerThread (p=0x8efb60)
at dispatcher.cpp:200
#11 0x00007fbf4eb17200 in thread_proxy ()
from /usr/lib/libboost_thread.so.1.42.0
#12 0x00007fbf4d868b50 in start_thread ()
from /lib/x86_64-linux-gnu/libpthread.so.0
#13 0x00007fbf4db5690d in clone () from /lib/x86_64-linux-gnu/libc.so.6
#14 0x0000000000000000 in ?? ()
[/code]

Jeśli byłyby potrzebne dodatkowe dane proszę pisać.

Prosiłbym o poradę dlaczego tak się dzieje, trochę nad tym siedziałem ale nie udaje mi się znaleźć przyczyny.

Pozdrawiam.

0

Występuje on po kilku godzinach działania aplikacji, w tym czasie funkcja ta zostaje wywołana kilkanaście tysięcy razy.

do tego multithreading, więc najprawdopodobniej coś sknociłeś z synchronizacją danych.
Takie błędy trudno zlokalizować. Na szczęście są do tego narzędzia, valgrind z helgrind'em powinien pomóc.


jeszcze jedno ten błąd może też wynikać z tego, że naruszyłeś strukturę sterty (wtedy błąd może byś w dowolnym innym miejscu niż się objawia). Upewnij się, czy gdzieś nie przekraczasz zakresu tablicy, czy nie używasz nieważnego wskaźnika itp. memcheck z valgrind'a może się przydać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1