Russian Qt Forum
Ноябрь 24, 2024, 03:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 3 [4]   Вниз
  Печать  
Автор Тема: Нужен совет по отладке  (Прочитано 33270 раз)
Ced
Гость
« Ответ #45 : Июнь 05, 2017, 20:53 »

Операция то допустима, вы получите второй список с указателями на те-же самые объекты x.
Вы потом как эти объекты освобождаете? Повторных освобождений не делаете?

Надеюсь, что нет. Сейчас все перепроверяю пошагово.
Записан
Ced
Гость
« Ответ #46 : Июнь 05, 2017, 20:56 »

Да. и мне удалось таки выйти на место падения.
Код:
void MyServer::sendToClient(/*QTcpSocket*/ QIODevice *pSocket, Message *toSend)
{
    QByteArray arrBlock;
    QDataStream out (&arrBlock, QIODevice::WriteOnly);

    out.setVersion (QDataStream::Qt_4_8);
    out << quint16 (0) << QTime::currentTime () << *toSend;
    out.device ()->seek (0);
    out << quint16 (arrBlock.size ()- sizeof (quint16));

    pSocket->write (arrBlock);
    pSocket->waitForBytesWritten (100);
    QThread::msleep (50);
}

Слот отрабатывает. Перед его завершением дебагер возвращается сперва ко второй строке, а за тем к первой. В этот момент и происходит падение. И вот еще что, если в дебагере идти медленно, падения скорее всего не произойдет. Последнюю задержку я вставил именно по этой причине.
« Последнее редактирование: Июнь 05, 2017, 21:05 от Ced » Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #47 : Июнь 05, 2017, 21:06 »

Эта задержка ничего не дает.
Попробуйте изменить слот следующим образом:
Код
C++ (Qt)
void MyServer::sendToClient(/*QTcpSocket*/ QIODevice *pSocket, Message *toSend)
{
   QByteArray arrBlock;
   {
   QDataStream out (&arrBlock, QIODevice::WriteOnly);
 
   out.setVersion (QDataStream::Qt_4_8);
   out << quint16 (0) << QTime::currentTime () << *toSend;
   out.device ()->seek (0);
   out << quint16 (arrBlock.size ()- sizeof (quint16));
   }
 
   qDebug() << arrBlock.size();
   pSocket->write (arrBlock);
   pSocket->waitForBytesWritten (100);
}

Фигурные скобки нужны. Плюс понаблюдайте за размерами пакета.
Записан
Ced
Гость
« Ответ #48 : Июнь 05, 2017, 21:21 »

Размеры пакета 30221. Скобки сейчас поставлю.
Записан
Ced
Гость
« Ответ #49 : Июнь 08, 2017, 21:24 »

Ну вот, даю отчет о результатах.
1. Утечки нашел с использованием диспетчера задач. Последовательно двигался в дебагере и после каждого шага смотрел в диспетчер. Вполне рабочий инструмент.
2. Главная утечка оказалась на самом видном месте. QByteArrea arrBlock в приведенном мною тексте. В конце слота его надо было чистить.
Ну вот собственно и все. Две недели битвы увенчались успехом. Все, кто помогал, - спасибо.
« Последнее редактирование: Июнь 08, 2017, 21:25 от Ced » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #50 : Июнь 08, 2017, 23:40 »

2. как-то странно, ведь в конце слота будет вызван деструктор arrBlock, который и так его очистит...
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #51 : Июнь 09, 2017, 08:34 »

Ну вот, даю отчет о результатах.
1. Утечки нашел с использованием диспетчера задач. Последовательно двигался в дебагере и после каждого шага смотрел в диспетчер. Вполне рабочий инструмент.
2. Главная утечка оказалась на самом видном месте. QByteArrea arrBlock в приведенном мною тексте. В конце слота его надо было чистить.
Ну вот собственно и все. Две недели битвы увенчались успехом. Все, кто помогал, - спасибо.
1. Диспетчером задач ты утечки не найдешь.
2. Поздравляю! Но ошибку ты не нашел. QByteArrea у тебя уничтожается. Теперь падать у тебя будет где-то в другом месте и, возможно, не сейчас, а через неделю или месяц. А может и в этом.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Ced
Гость
« Ответ #52 : Июнь 09, 2017, 16:10 »

1. Диспетчером задач ты утечки не найдешь.
2. Поздравляю! Но ошибку ты не нашел. QByteArrea у тебя уничтожается. Теперь падать у тебя будет где-то в другом месте и, возможно, не сейчас, а через неделю или месяц. А может и в этом.

Первое утверждение бессмысленно. По факту нашел. Мелкие утечки остались. Но результат таков: Когда я приступил, программа могла обработать примерно 6 часов данных. Теперь она по факту обрабатывает 10 дней и прогноз, судя по размерам приложений - примерно 70. Итого я сократил утечки на два порядка. Точнее диспетчер действительно не поможет, но это уже не столь актуально. Разберусь постепенно.
А что до второго, это была не единственная ошибка. Но она тоже была.
« Последнее редактирование: Июнь 09, 2017, 16:13 от Ced » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #53 : Июнь 09, 2017, 16:42 »

1) диспетчер не показывает потребление памяти
2) это не ошибка
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #54 : Июнь 09, 2017, 16:43 »

К сожалению (для Вас) Пантер скорее всего прав - очень похоже что Вы не решили проблему, а загнали ее в "хронь". Чем чаще падает - тем лучше, самый мерзкий баг - тот что возникает в году раз
Записан
Ced
Гость
« Ответ #55 : Июнь 11, 2017, 02:03 »

Программа проработала непрерывно двое суток. За это время было выполнено больше миллиона циклов обработки данных. Это дает мне основание считать. что  проблема таки решена. А что до памяти, диспетчер показывает память, занимаемую каждым приложением с точностью до 1 КБт. В моем случае этого оказалось достаточно.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #56 : Июнь 11, 2017, 13:19 »

Ну, у Вас может быть и проработало, а вот у конечного пользователя может не проработать (так сойдутся звезды)...
Записан

ArchLinux x86_64 / Win10 64 bit
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #57 : Июнь 12, 2017, 10:11 »

Программа проработала непрерывно двое суток. За это время было выполнено больше миллиона циклов обработки данных. Это дает мне основание считать...
Не дает. Читаем классику
Цитировать
Тестирование может показать наличие ошибок но не их отсутствие
Записан
AzazelloAV
Гость
« Ответ #58 : Июнь 26, 2017, 21:45 »

Программа проработала непрерывно двое суток. За это время было выполнено больше миллиона циклов обработки данных. Это дает мне основание считать. что  проблема таки решена. А что до памяти, диспетчер показывает память, занимаемую каждым приложением с точностью до 1 КБт. В моем случае этого оказалось достаточно.

А прикольно. Если есть какая-то последовательность действий, совершенно дурацкая, которая приводит к падению,  о которой знает только разработчик и её невозможно повторить...... Она будет повторена пользователем сразу.....

Я за вас говорить не буду. Но! Какое это счастье для меня, что программа падает. А вот когда не падает...... Ищи свищи.

Такие ошибки (кроме валгринда) помогало вылечивать компиляцией разными компиляторами и под разные ОС - поведение отличалось.
Ну повезло вам. Вы же программу "статически" тестировали - т.е. запустили и пошли спать. Никто никакой word не запускал, ни база рядом не крутилась.
Другими словами ваша битая память не затиралась никакими данными, поэтому и работает.

Это к чему я. Жопа всё равно настанет........
Записан
Страниц: 1 2 3 [4]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.149 секунд. Запросов: 23.