LINUX.ORG.RU

segmentation fault

 ,


0

1

Отлаживаю баг в одном проекте, часть которого на писана на С++. Проблема в segmentation fault(SIGSEGV), программа падает. Где падает я узнал

Вот тут, после этого вызова

m_listener->onClose(m_id) //Listener* m_listener


m_listener это virtual метод класса.
class Listener {
public:
	virtual void onData(uint32_t id, TransportData data) = 0;
	virtual void onClose(uint32_t id) = 0;
};




Сам объект класса TransportSession, в котором падает, создается через

m_session = std::make_shared<TransportSession>(0, m_service, std::move(m_socket), this);


Какие могут быть вообще причины возникновения segmentation fault? Удалилась ссылка на m_listener? Проверить указатель как я читал, в С++ никак не возможно.
Делал
if(m_listener != NULL)
if(m_listener != nullprt)

бесполезно

★★★★

Ошибка была в том (ну я почти в этом уверен), что m_listener использовался после его уничтожения (перед сегфолтом вызывался destruct). Как исправить не знаю, видимо нужно весь алгоритм менять

m_listener - это наследник Listener, который реализует onClose

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

Как исправить не знаю

Кто-бы не destro’ил Listener obj должен нотифицировать session. Session должна занулять listener ptr, ну и не надо dispatch onClose() на null ptr. Наверное сумбурно, но разберётесь.

bugfixer ★★★★★
()
Ответ на: комментарий от anonymous

Боюсь там до продакшена еще очень далллеко;-)

AntonI ★★★★★
()
Ответ на: комментарий от bugfixer

Да не разрулил, ошибка то осталась ) Теперь мне надо понять удалился или нет, если нет, то вызывать onClose

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

ошибка то осталась )

Семён Семёныч! Выкладывай сорсы, но раньше чем в выходные не посмотрю…

bugfixer ★★★★★
()
Ответ на: комментарий от gobot

Все, что я там увидел это адрес на который указывает m_listener, типа такого 0x46dd570

так в отладчике можно сходить по этому адресу, посмотреть что на его кухне творится. Наиболее вероятно, что либо вы что-то с виртуализацией не так сделали или, возможно, с выделением памяти. В этом плане gdb и пмсм QtCreator обёртка для gdb прекрасно могут решить задачу, которая, повторюсь, заключается в отслеживании состояния указателей прямо до падения.

AKonia ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.