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

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

Страниц: 1 [2] 3 4 ... 6   Вниз
  Печать  
Автор Тема: Странная ошибка SIG SEGV  (Прочитано 35616 раз)
vbi
Гость
« Ответ #15 : Март 21, 2012, 12:12 »

какая версия Qt, какая ось?
4.8.0 Windows 7
Записан
vbi
Гость
« Ответ #16 : Март 21, 2012, 12:14 »

Не вижу где replyWasDeleted устанавливается в true. Если deleteLater успеет проскочить - обращение к удаленному объекту. В любом случае включить печати в конструкторе/деструкторе и посмотреть на вылете

Код:
connect(reply,SIGNAL(destroyed()),this,SLOT(replyDestroyed()));

а в replyDestroyed() есть строчка:
Код:
replyWasDeleted = true;
Записан
vbi
Гость
« Ответ #17 : Март 21, 2012, 12:18 »

Но потом я повесил слот
Код:
connect(reply,SIGNAL(destroyed()),this,SLOT(replyDestroyed()));
на удаление reply где меняется переменная replyWasDeleted
и проверяю ее. Если она истина, то не пытаюсь удалить reply.  Теперь исключение можно убрать. Я так оставил на всякий случай
Как я понял, установка replyWasDeleted=true происходит в слоте replyDestroyed. Если так то не забыли ли Вы взять мутекс (mtx) в этом слоте? И в любом случае replyWasDeleted надо проверять перед reply->abort


Стоп. Сейчас, когда я добавил connect(reply,SIGNAL(destroyed()),this,SLOT(replyDestroyed())); и там устанавливаю переменную, а перед удалением reply проверяю ее, то все работает нормально, исключений не возникает при удалении reply. В коде try можно убрать. Я ж говорю я его просто забыл убрать. В этом участке кода проблем нет.
Проблема тут в (смотрите мое первое сообщение + бектрейс)
Записан
vbi
Гость
« Ответ #18 : Март 21, 2012, 12:19 »

Попробуй писать лог, в начале каждой функции выводи сообщение о том что функция начала свое выполнение, а в конце о том что закончила. Если повезет найдешь в какой функции ошибка возникает.
бектрейс намекает что не повезет
Можно же унаследоваться от QNetworkAccessManager и туда понапихать проверок с выводом параметров.
V1KT0P, спасибо за советы, попробую  Улыбающийся!
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #19 : Март 21, 2012, 12:35 »

Стоп. Сейчас, когда я добавил connect(reply,SIGNAL(destroyed()),this,SLOT(replyDestroyed())); и там устанавливаю переменную, а перед удалением reply проверяю ее, то все работает нормально, исключений не возникает при удалении reply. В коде try можно убрать. Я ж говорю я его просто забыл убрать. В этом участке кода проблем нет.
Проблема тут в (смотрите мое первое сообщение + бектрейс)
Там у Вас еще один abort и deleteLater. И вообще: вызываете reply->read, откуда известно что reply не удален?
Записан
vbi
Гость
« Ответ #20 : Март 21, 2012, 12:44 »

Стоп. Сейчас, когда я добавил connect(reply,SIGNAL(destroyed()),this,SLOT(replyDestroyed())); и там устанавливаю переменную, а перед удалением reply проверяю ее, то все работает нормально, исключений не возникает при удалении reply. В коде try можно убрать. Я ж говорю я его просто забыл убрать. В этом участке кода проблем нет.
Проблема тут в (смотрите мое первое сообщение + бектрейс)
Там у Вас еще один abort и deleteLater. И вообще: вызываете reply->read, откуда известно что reply не удален?
Дело в том, что reply иногда уже был удален только в одной процедуре, та что на таймере висит и запускается если Reply так и не пришел. А там reply->read нету. Хотя может таймер срабатывает после той процедуры, которая получает QNetworkReply. Я ведь поток не удаляю, а снимаю мутекс и использую снова. Надо будет проверить. Спасибо.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #21 : Март 21, 2012, 17:04 »

После выполнения
Код:
reply = manager->get(QNetworkRequest(QUrl(sDomain,QUrl::TolerantMode)));
reply потом каким-то образом иногда становится удаленным, т. е. объекта не существует. Тогда кидало ошибку.

А reply при этом точно != 0? Ты вообще не делаешь проверку на 0 ни после get, ни в слоте checkSiteFinished, что плохо.
Записан
vbi
Гость
« Ответ #22 : Март 21, 2012, 21:10 »

А reply всегда равено 0 если объект не создан (или удален)?
Кстате запускал не удаляя reply вообще, закоментировав данные строки - та же ошибка, не пропала. Я так понимаю судя по бектрейсу отправляется какое-то сообщение о аутентификации и почему-то падает на QString'е
Записан
vbi
Гость
« Ответ #23 : Март 23, 2012, 12:42 »

Пробовал дебаги выводить - все равно не могу найти в чем проблема.
Ладно, потратил время. Вырвал кусок программы, скомпилил, подправил. Протестил - тоже получает эту ошибку.

Вообщем вот, пинайте: bibyte.net/testThreads.zip

За неудаление объектов и лишние сигналы слоты прошу не бить Улыбающийся
Запускаете проект. Нажимаете на форме кнопку "тестировать потоки". Ждете. Со временем выведется ошибка. Может через 15 минут, а может через 6 часов...

Может по коду подскажете ткнете в ошибку  Строит глазки
Записан
vbi
Гость
« Ответ #24 : Март 23, 2012, 13:20 »

Хотя на протяжении 20 минут у меня полюбому выскакивает
Записан
Bepec
Гость
« Ответ #25 : Март 23, 2012, 14:30 »

Могу вас обрадовать - ваш проект валится изза мутексов Улыбающийся ровно 32 штуки анлоков Улыбающийся

dj
Код:
void VBCheckURLThread::runChecking()
{
    mtx.unlock();  <<<<<<<<<<<<<<<<<<<<<=========== Что за ??? :)
    if(!sManagerWasCreated)
    {
        manager = new QNetworkAccessManager(); // тут утечки памяти
        sManagerWasCreated = true;
    }
    connect(manager, SIGNAL(finished(QNetworkReply*)),this, SLOT(checkSiteFinished(QNetworkReply*)));   // тут утечки памяти
    connect(manager, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)),this, SLOT(checkAuthenticationRequired(QNetworkReply*,QAuthenticator*)));
    replyWasDeleted = false;
    reply = manager->get(QNetworkRequest(QUrl(sDomain,QUrl::TolerantMode)));                    //// qDebug()<<"4";   // тут утечки памяти
    connect(reply,SIGNAL(destroyed()),this,SLOT(replyDestroyed()));
    emit startTimer(30000);
}

Извиняюсь конечно, мб я недостаточно терпеливый, но ваша программа посылает 32 запроса и спит... Как боярин мордой в стогу. Попытавшись разобраться с архитектурой - плюнул. Возможно это нерабочий пример и я поспешил вам помогать?
« Последнее редактирование: Март 23, 2012, 14:42 от Bepec » Записан
V1KT0P
Гость
« Ответ #26 : Март 23, 2012, 14:49 »

Извиняюсь конечно, мб я недостаточно терпеливый, но ваша программа посылает 32 запроса и спит... Как боярин мордой в стогу. Попытавшись разобраться с архитектурой - плюнул. Возможно это нерабочий пример и я поспешил вам помогать?
Я тоже попытался запустить. После нажатия кнопки на экране появляются несколько десятков рантайм ошибок. Я испугался, закрыл и больше не хочу его запускать.
Записан
Bepec
Гость
« Ответ #27 : Март 23, 2012, 14:55 »

Виктор там мутекс анлок надо закомментить Улыбающийся Я в куске кода привёл его с "<<<<<<<<====== Что за?"

Хотя в принципе ничего не измениться. Нифига не работает Веселый
Записан
vbi
Гость
« Ответ #28 : Март 23, 2012, 15:52 »

Хм.. а как вы узнали что здесь валится?

Просто после запуска процедуры "runChecking()" выполнение всередине класса "VBCheckURLThread" попадает либо в "checkSiteFinished" либо в "checkWork()" (либо QNetworkAccessManager вернет reply, либо сработает таймер на превышении времени). Каждая из этих процедур замыкает мютекс mtx. Какая первая замкнет - та и выполнится. потом мютекс не размыкается а добавляется в стек в классе "mainwondow". Когда этот объект понадобится, он достается из стека опять и снова запускается процедура "runChecking()", которая и размыкает ранее замкнутый мютекс.

Переписал код:



Код:
void VBCheckURLThread::runChecking()
{
    //mtx.unlock(); /////////////////////////////////////// - ЗАКОМЕНТИРОВАЛ
    if(!sManagerWasCreated)
    {
 
  ...
}

void VBCheckURLThread::checkWork()
{
 ...
    offNode();
    mtx.unlock(); ////////////////////////////////////// ДОБАВИЛ ++++++++
}

void VBCheckURLThread::checkSiteFinished(QNetworkReply* localReply)
{
  ...
        offNode();
        mtx.unlock(); ////////////////////////////////////// ДОБАВИЛ перед RETURN ++++++++
        return;
  ...
    offNode();
    mtx.unlock(); ////////////////////////////////////// ДОБАВИЛ ++++++++
}

что дает тот же результат, только не пытается размыкать мютекс сначала.

После запуска через пару минут - та же самая ошибка Грустный(( (спасибо за попытку)

Перезалил архив проекта с изменениями: http://bibyte.net/testThreads.zip
Записан
vbi
Гость
« Ответ #29 : Март 23, 2012, 15:56 »

если тот мутекс закоментировать - то программа будет спать после 32 ответов. Если его убрать - тогда ниже надо добавить (см. выше, или скачайте проект наново, я обновил).
Записан
Страниц: 1 [2] 3 4 ... 6   Вверх
  Печать  
 
Перейти в:  


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