Russian Qt Forum

Qt => Общие вопросы => Тема начата: Crazy Sage от Сентябрь 15, 2017, 06:59



Название: Странный вылет на connect'е [Qt 5.9]
Отправлено: Crazy Sage от Сентябрь 15, 2017, 06:59
Возникла очень странная ситуация, при попытке сделать рядовой QObject::connect программа стабильно падает в функции
void QObjectPrivate::addConnection(int signal, Connection *c)
на
Q_ASSERT(c->sender == q_ptr);

В другом проекте, использующем те же классы и коннект тех же сигнала и слота всё нормально. Может кто-нибудь сталкивался с подобной мистикой и знает, каким косяком в коде она может быть вызвана? А то совершенно непонятно даже где искать.


Название: Re: Странный вылет на connect'е [Qt 5.9]
Отправлено: gil9red от Сентябрь 15, 2017, 07:10
Код в студию! :)


Название: Re: Странный вылет на connect'е [Qt 5.9]
Отправлено: kambala от Сентябрь 15, 2017, 10:35
проверь, что оба объекта, которые ты пытаешься связать, «живы»


Название: Re: Странный вылет на connect'е [Qt 5.9]
Отправлено: vic57 от Сентябрь 15, 2017, 13:26
Q_ASSERT(c->sender == q_ptr);
если сегфолт м.б. q_ptr = null ?


Название: Re: Странный вылет на connect'е [Qt 5.9]
Отправлено: Crazy Sage от Сентябрь 18, 2017, 10:34
Код в студию! :)

Код на котором вылетает - обычный коннект, в другом проекте он работает, так что дело не в нём. А другого кода там очень много и скорее всего присутствует какой-то скрытый конфликт, который сложно найти, не зная, что искать.


Название: Re: Странный вылет на connect'е [Qt 5.9]
Отправлено: Crazy Sage от Сентябрь 18, 2017, 11:25
Заметил закономерность, может кому-нибудь она о чём-то скажет.
При подключении к слотам проблемного объекта всё ок, при попытке подключиться к его сигналам - падение.


Название: Re: Странный вылет на connect'е [Qt 5.9]
Отправлено: Crazy Sage от Сентябрь 18, 2017, 13:51
Q_ASSERT(c->sender == q_ptr);
если сегфолт м.б. q_ptr = null ?

Проверил, q_ptr = 0x1de, c->sender = @0x1cd36780


Название: Re: Странный вылет на connect'е [Qt 5.9]
Отправлено: vic57 от Сентябрь 18, 2017, 14:27
Проверил, q_ptr = 0x1de, c->sender = @0x1cd36780
а старый метод connect работает? в 5.9 вроде поменяли схему надо callback или lambda добавлять


Название: Re: Странный вылет на connect'е [Qt 5.9]
Отправлено: Bepec от Сентябрь 18, 2017, 15:00
А кода нет нет нет, а кода неееет. И обсуждать нечего.


Название: Re: Странный вылет на connect'е [Qt 5.9]
Отправлено: Crazy Sage от Сентябрь 19, 2017, 08:48
А код бы и не помог.
Решение:
Может кому на будущее поможет - если у вас начинается фигня с вылетами на коннекте в глубинах qt, поищите в коде #pragma pack push/pop
у нас какой-то неизвестный герой, в хэдере подключавшемся на четвёртом или пятом уровне вложенности оставил #pragma pack push без парного к нему #pragma pack pop и Qt с этого сильно плохо стало.


Название: Re: Странный вылет на connect'е [Qt 5.9]
Отправлено: Alex Custov от Сентябрь 19, 2017, 11:51
Заметил закономерность, может кому-нибудь она о чём-то скажет.
При подключении к слотам проблемного объекта всё ок, при попытке подключиться к его сигналам - падение.

Налицо проблемы работы с памятью - двойное удаление указателей и т.п. Ищи ошибки в коде с помощью утилит типа valgrind.


Название: Re: Странный вылет на connect'е [Qt 5.9]
Отправлено: vic57 от Сентябрь 19, 2017, 18:00
у нас какой-то неизвестный герой, в хэдере подключавшемся на четвёртом или пятом уровне вложенности оставил #pragma pack push без парного к нему #pragma pack pop и Qt с этого сильно плохо стало.
если хедер кутэшный, дай ссылку на него. интересно однако


Название: Re: Странный вылет на connect'е [Qt 5.9]
Отправлено: Crazy Sage от Сентябрь 19, 2017, 18:15
у нас какой-то неизвестный герой, в хэдере подключавшемся на четвёртом или пятом уровне вложенности оставил #pragma pack push без парного к нему #pragma pack pop и Qt с этого сильно плохо стало.
если хедер кутэшный, дай ссылку на него. интересно однако

Нет, хэдер наш, но если какой-то Qt-шный хэдер оказывается подключенным после него (что в большом проекте почти гарантировано и что у нас и произошло), то Qt от этой прагмы плохеет, а валгринд измененное выравнивание памяти не отлавливает.


Название: Re: Странный вылет на connect'е [Qt 5.9]
Отправлено: Bepec от Сентябрь 19, 2017, 21:00
Та после такой прагмы всё нафиг полетит :D


Название: Re: Странный вылет на connect'е [Qt 5.9]
Отправлено: vic57 от Сентябрь 20, 2017, 00:38
Нет, хэдер наш, но если какой-то Qt-шный хэдер оказывается подключенным после него (что в большом проекте почти гарантировано и что у нас и произошло), то Qt от этой прагмы плохеет, а валгринд измененное выравнивание памяти не отлавливает.
да уж блин, засада. бэкапы - наше все  :o


Название: Re: Странный вылет на connect'е [Qt 5.9]
Отправлено: kambala от Сентябрь 21, 2017, 12:38
системой контроля версиями хоть пользуетесь? например, через git bisect можно было бы достаточно быстро найти проблему.


Название: Re: Странный вылет на connect'е [Qt 5.9]
Отправлено: Crazy Sage от Сентябрь 21, 2017, 12:45
системой контроля версиями хоть пользуетесь? например, через git bisect можно было бы достаточно быстро найти проблему.

Из-за большого проекта и изрядной его завязанности на железе, разрабатываемом параллельно, разные компоненты изначально собирались отдельно в тестовых проектах, а когда всё начали объединять в общий проект, тут-то оно и грохнулось (потому что в тестовом проекте цепочка к этому хэдеру оказалась в удачном месте и ничего не падало), так что и система контроля версий не помогла.