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

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

Страниц: [1] 2 3 4   Вниз
  Печать  
Автор Тема: Нужен совет по отладке  (Прочитано 33301 раз)
Ced
Гость
« : Май 31, 2017, 15:22 »

Код:
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);
    quint16  temp = arrBlock.size ();
    out << quint16 (arrBlock.size ()- sizeof (quint16));

    pSocket->write (arrBlock);
    pSocket->waitForBytesWritten (100);
}

Операция нормально выполняется 16810 раз и падает на pSocket->write (arrBlock);
Размеры arrBlock в подавляющем большинстве операций одинаковые и равны примерно 20КБайт.
У меня уже вывих мозга. Может кто посоветует, где искать?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #1 : Май 31, 2017, 15:25 »

Я советую смотреть в других местах. Погоняй под валгриндом.
Записан

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

Я советую смотреть в других местах. Погоняй под валгриндом.

А что такое валгринд?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #3 : Май 31, 2017, 15:41 »

http://valgrind.org/

Но это под Линукс.
Ты портишь памыть где-то в другом месте. Или передаешь в метод что-то невалидное. Очень смущает работа через указатели. Это тебе не СИ, тут указатели нужны как можно реже.
Записан

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

http://valgrind.org/

Но это под Линукс.

А под виндой что-то подобное?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Май 31, 2017, 16:00 »

Операция нормально выполняется 16810 раз и падает на pSocket->write (arrBlock);
Нужно постараться извлечь как можно больше из "места падения", что видно в отладчике, а не так себе просто "падает" и все. Возможно писать arrBlock сначала в файл чтобы потом его спокойно проверить. В общем найти "кто испорчен", потом уже как/когда
Записан
Ced
Гость
« Ответ #6 : Май 31, 2017, 16:10 »

Операция нормально выполняется 16810 раз и падает на pSocket->write (arrBlock);
Нужно постараться извлечь как можно больше из "места падения", что видно в отладчике, а не так себе просто "падает" и все. Возможно писать arrBlock сначала в файл чтобы потом его спокойно проверить. В общем найти "кто испорчен", потом уже как/когда

Перед записью я его сам формирую. Имею возможность посмотреть все формирование. Правда делал это уже много раз. Пока криминала на вижу. И не совсем понимаю, а как содержание arrBlock может валить write? Иначе говоря, а что там искать?
Дополнительно. Размер массива больше, чем я написал в начале. Он составляет 34221 байт.
« Последнее редактирование: Май 31, 2017, 16:17 от Ced » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #7 : Май 31, 2017, 16:13 »

Ошибка может быть совершенно в другом месте.
Записан

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

Ошибка может быть совершенно в другом месте.

Это я понял. Не понял, как это место искать под виндой?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #9 : Май 31, 2017, 16:16 »

Операция нормально выполняется 16810 раз и падает на pSocket->write (arrBlock);
Куда указывает указатель pSocket в момент падения?
Записан
Ced
Гость
« Ответ #10 : Май 31, 2017, 16:18 »

Операция нормально выполняется 16810 раз и падает на pSocket->write (arrBlock);
Куда указывает указатель pSocket в момент падения?

Сейчас проверю. Но сомневаюсь. что дело в нем. Я писал, прежде чем упасть программа выполняется 16810 раз и рассылает массив по трем сокетам. Если бы дело было в неверном сокете, наверно бы это проявилось раньше.
Записан
Ced
Гость
« Ответ #11 : Май 31, 2017, 16:23 »

Операция нормально выполняется 16810 раз и падает на pSocket->write (arrBlock);
Куда указывает указатель pSocket в момент падения?

Вышел на место падения пока адрес сокета такой
Цитировать
   
            clientSocket   @0x7fe3b618   QTcpSocket
               [QAbstractSocket]   @0x15f97928   QAbstractSocket
                  [QIODevice]   @0x15f97928   QIODevice
                  staticMetaObject   @0x67fb3104   QMetaObject
               staticMetaObject   @0x67fee15c   QMetaObject
Сейчас пройду до падения
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

И не совсем понимаю, а как содержание arrBlock может валить write? Иначе говоря, а что там искать?
Начинать нужно с самого внимательного обзора места падения в отладчике. На какой машинной команде вылет? Какой строке кода она соответствует в отладчике? Посмотреть this и др указатели/ссылки, может они калечные. Повторюсь - найти "кто испорчен", дальше ставить условный breakpoint и ловить (да, как правило ошибки далеко от этого места)
Записан
Ced
Гость
« Ответ #13 : Июнь 01, 2017, 08:14 »

И не совсем понимаю, а как содержание arrBlock может валить write? Иначе говоря, а что там искать?
Начинать нужно с самого внимательного обзора места падения в отладчике. На какой машинной команде вылет? Какой строке кода она соответствует в отладчике? Посмотреть this и др указатели/ссылки, может они калечные. Повторюсь - найти "кто испорчен", дальше ставить условный breakpoint и ловить (да, как правило ошибки далеко от этого места)

Пытаюсь идти по такому пути. Проблема в том, что под отладчиком и без оного программа падает на разных циклах обработки. Еще точка падения зависит от детальности отладки, на какую глубину заходил. Из за этого никак не могу точно локализоваться.
Записан
Ced
Гость
« Ответ #14 : Июнь 01, 2017, 08:28 »

Такое поведение наводит на мысль о нарушении границ отведенных областей памяти. И, как тут уже говорено, не в точке падения. И даже не факт, что в том цикле, где происходит падение. Может кто посоветует средство анализа работы с памятью под винду?
Записан
Страниц: [1] 2 3 4   Вверх
  Печать  
 
Перейти в:  


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