Название: Странности с объектом класса Отправлено: joffadark от Март 06, 2015, 01:03 Здравствуйте. Возникла непонятная проблема. Код довольно громоздок, т.к. проект немаленький. Поэтому попробую описать словами и маленькими вставками псевдокода.
Есть класс десериализатор (CPacket), который при помощи метода FromBinary заполняет из "двоичных" данных на входе (const char* buf, int len) свои собственные поля. Есть еще один класс (CNetworkSession), класс создает объект QUdpSocket, и ловит из него датаграммы. По факту прихода новой датаграммы CNetwork генерирует сигнал (onNewPacket) и передает туда массив char* и его длину int length. Т.е если псевдокодом описать: Код
Ну и есть, соответственно, третий класс который уже ловит сигнал onNewPacket(...) от CNetworkSession, применяет класс десериализатор CPacket, ну и в общем далее делает что хочет с этими структурированными данными. примерно таким образом: Код
В общем, когда вызывается packet.FromBinary() внутри него все данные десериализуются правильно (трассировка + watch показали). когда далее в someValue происходит присвоение packet.getSomeValue(), в someValue попадают абсолютно неверные данные. если идти трассировкой в слоте SlotOnNewPacket и посмотреть в Watch значения объекта packet какбы из слота, то там тоже неверные данные. Причем они такие, как будто в структуре класса произошло некое смещение. Если унаследовать CPacket от QObject и добавить к нему макрос Q_OBJECT, при трассировке из слота в объекте поля становятся верными. но в intSomeValue всё равно попадает какая-то фигня. getSomeValue() - это обычный геттер приватного свойства. Подскажите пожалуйста, что за магия такая :( Самое фиговое, что всё это выполняется в одном трэде и не распараллеливалось (да и не нужно). Я бы понял, если бы что-то подобное творилось между разными тредами. Прям расстраивает Qt во времена таких диких странностей. Название: Re: Странности с объектом класса Отправлено: Alex Custov от Март 06, 2015, 01:13 когда далее в someValue происходит присвоение packet.getSomeValue(), в someValue попадают абсолютно неверные данные. Десериализатор работает неправильно, это же очевидно. Минимальный код в студию, И минимальный набор бинарных данных в аттаче. Прям расстраивает Qt во времена таких диких странностей. Шутку оценил ;D Название: Re: Странности с объектом класса Отправлено: joffadark от Март 06, 2015, 08:57 когда далее в someValue происходит присвоение packet.getSomeValue(), в someValue попадают абсолютно неверные данные. Десериализатор работает неправильно, это же очевидно. Минимальный код в студию, И минимальный набор бинарных данных в аттаче. Прям расстраивает Qt во времена таких диких странностей. Шутку оценил ;D Ну, во-первых, это действительно шутка :) А по поводу десериализации я же написал, что внутри FromBinary все свойства объекта класса CPacket устанавливаются верно (Wireshark + я знаю, что должно быть). Возможно как-то некорректно описал. Т.е. методика отладки такова: Код
Если же CPacket сделать наследником QObject и добавить ему макрос Q_OBJECT, то сразу при выходе из FromBinary watch показывает ВЕРНЫЕ значения свойств объекта. но в int someValue = packet.getSomeValue(); падает НЕВЕРНОЕ ЗНАЧЕНИЕ. Примерное краткое описание CPacket, без наследдования от QObject: Код
Соответственно, c наследованием от QObject: Код
после добавления наследования очистку, Qmake и пересборку делал. P.S. забыл сказать, что ОС Ubuntu Linux 12.04 LTS. + статическая сборка Qt 5.3.1 Название: Re: Странности с объектом класса Отправлено: Alex Custov от Март 06, 2015, 10:54 А по поводу десериализации я же написал, что внутри FromBinary все свойства объекта класса CPacket устанавливаются верно (Wireshark + я знаю, что должно быть). Возможно как-то некорректно описал. Т.е. методика отладки такова: Это всё гадание на кофейной гуще. Нужно сократить рабочий пример до чтения заранее подготовленных бинарных данных из файла и их десериализации. Если проблема всё ещё воспроизводится - выложить этот код и данные. Название: Re: Странности с объектом класса Отправлено: Igors от Март 06, 2015, 11:01 Попробуйте печатать "адрес + значение переменной" в 2 местах (знаете в каких)
Название: Re: Странности с объектом класса Отправлено: joffadark от Март 07, 2015, 22:40 Спасибо всем! ;D
Проблему нашел, когда - по совету Alex и Igors - не поленился и запилил полный прототип механизма (он не совсем прост, чтобы просто его воспроизвести в демо проекте, пришлось потратить субботний вечер за пивом). В процессе запила понял, что дико всё накостылил и, упростив код, решил проблему. Название: Re: Странности с объектом класса Отправлено: kuzulis от Март 07, 2015, 23:15 Юнит тесты спасут капитана!
|