Russian Qt Forum

Qt => Вопросы новичков => Тема начата: polina89 от Март 30, 2014, 01:19



Название: query.exec Segmentation fault
Отправлено: polina89 от Март 30, 2014, 01:19
Здравствуйте!Помогите, пожалуйста. Пишу простейший запрос.
Код:
QSqlQuery query(QSqlDatabase::database("mydb"));
query.clear();
query.exec("select * from transit");
И почему-то вылетает SegmentationFault. В чем может быть дело?(((
Вот стек вызовов. :)

Thread 1 (Thread 6004.0x1434):
#0  0x0b767e36 in load<int> (_q_value=@0x80000004: <error reading variable>) at ../../include/QtCore/../../src/corelib/thread/qgenericatomic.h:96
No locals.
#1  QBasicAtomicInteger<int>::load (this=0x80000004) at ../../include/QtCore/../../src/corelib/thread/qbasicatomic.h:141
No locals.
#2  0x0b767811 in QWeakPointer<QObject>::data (this=0x172df658) at ../../include/QtCore/../../src/corelib/tools/qsharedpointer_impl.h:556
No locals.
#3  0x0b76a167 in QPointer<QSqlDriver>::data (this=0x172df658) at ../../include/QtCore/../../src/corelib/kernel/qpointer.h:78
No locals.
#4  0x0b76a17f in QPointer<QSqlDriver>::operator QSqlDriver* (this=0x172df658) at ../../include/QtCore/../../src/corelib/kernel/qpointer.h:84
No locals.
#5  0x0b749491 in QSqlResult::driver (this=0x172df650) at kernel\qsqlresult.cpp:373
        d = 0x172df650
#6  0x0b742122 in QSqlQuery::driver (this=0x28c4f8) at kernel\qsqlquery.cpp:458
No locals.
#7  0x0b741c45 in QSqlQuery::exec (this=0x28c4f8, query=...) at kernel\qsqlquery.cpp:356
        fo = 128
        __PRETTY_FUNCTION__ = "bool QSqlQuery::exec(const QString&)"
#8  0x0042ba14 in MainWindow::on_AllTableView_clicked (this=0x28fd9c, index=...) at ..\sources\mainwindow.cpp:644
        i = 0
        queryPhoto = {d = 0x17483dc8}
        data = {d = 0x28c548}
        transitid = 48
        query = {d = 0x172df650}


Название: Re: query.exec Segmentation fault
Отправлено: Nidxogg от Март 30, 2014, 18:20
Цитировать
QSqlDatabase::database("mydb")
Само подключение к базе открыто?
Многопоточное приложение?


Название: Re: query.exec Segmentation fault
Отправлено: polina89 от Март 30, 2014, 18:37
Код:
QSqlDatabase::database("mydb").isOpen();
непосредственно перед выполнением запроса возвращает true. То есть подключение к БД активно. Приложение многопоточное, но так сказать не везде. То есть обновление БД ведется в отдельном потоке и при получении данных по сети создаются дополнительные потоки. Конкретно в этом месте обработка идет в главном потоке.


Название: Re: query.exec Segmentation fault
Отправлено: Old от Март 30, 2014, 18:52
Для каждого потока делайте свое подключение.


Название: Re: query.exec Segmentation fault
Отправлено: polina89 от Март 30, 2014, 20:32
Но ведь эта часть обрабатывается в главном потоке. Этот кусок отрабатывает в самом начале работы программы. То есть в этот момент никаких других потоков кроме главного по идее еще не запущено.Но за совет спасибо!Буду иметь в виду :)


Название: Re: query.exec Segmentation fault
Отправлено: Old от Март 30, 2014, 20:40
Но ведь эта часть обрабатывается в главном потоке. Этот кусок отрабатывает в самом начале работы программы. То есть в этот момент никаких других потоков кроме главного по идее еще не запущено.Но за совет спасибо!Буду иметь в виду :)
Попробуйте скопировать этот кусок и создание подключения в отдельный тестовый проектик. И проверите, если будет падать в том же месте, то выкладывайте его сюда, а если не будет, то где то раньше (не в этом месте) вы что то делаете не так.


Название: Re: query.exec Segmentation fault
Отправлено: polina89 от Март 30, 2014, 21:03
В тестовом проекте все работает. :(Как можно раскопать, где ошибка? Я в таком случае даже не имею представления, с чего начать((((Ну то есть я комментирую отдельные участки кода, в надежде, что ошибка именно там.Но пока ничего не выходит(


Название: Re: query.exec Segmentation fault
Отправлено: Old от Март 30, 2014, 21:09
Как можно раскопать, где ошибка? Я в таком случае даже не имею представления, с чего начать((((
В таком случае, 90% что ошибка в битой памяти. :)
Если есть возможность работать под linux, то запустите программу под valgrind.
Нет, пробуйте все за комментировать, потом по частям убирать комментарии и смотрите, когда начнет падать.



Название: Re: query.exec Segmentation fault
Отправлено: polina89 от Март 30, 2014, 21:16
Спасибо!Возможности запустить под linux нет( Пытаюсь как раз методом комментирования понять, где ошибка.Единственное, что заметила, что этот код у меня для вот этого слота:
Код:
void MainWindow::on_AllTableView_clicked(const QModelIndex &index)
{
   
}
То есть для обработки нажатия на строку в TableView. И при просмотре в отладчике я вижу, что значение index равно invalid.Может, как-то отсюда начать пляски с бубном ???


Название: Re: query.exec Segmentation fault
Отправлено: Old от Март 30, 2014, 21:25
Т.е. пока вы не нажмете кнопку, программа работает корректно, нормально завершается?

Ну такие вещи нужно обязательно проверять, или assert'ами или if ... return.


Название: Re: query.exec Segmentation fault
Отправлено: polina89 от Март 30, 2014, 21:30
Да, все верно)Пока не тыкну мышкой на строку, то все отлично.


Название: Re: query.exec Segmentation fault
Отправлено: Old от Март 30, 2014, 21:30
Да, все верно)Пока не тыкну мышкой на строку, то все отлично.
Покажите весь метод.


Название: Re: query.exec Segmentation fault
Отправлено: polina89 от Март 30, 2014, 21:48
Код:
void MainWindow::on_AllTableView_clicked(const QModelIndex &index)
{
    //заполняем данными таблицу с превышениями и считываем из БД картинку
    //но предварительно очищаем всю таблицу
    for (int i=0; i<14; i++)
    {
        for(int m=0; m<4; m++)
        {
            ui->AxleTreeWidget->item(m,i)->setText(QObject::trUtf8(""));
        }
    }
    int transitid;
    int i=0;
    transitid=AllTransits->data(AllTransits->index(index.row(),0)).toInt();
    QSqlQuery query(QSqlDatabase::database("mydb"));
    QSqlQuery queryPhoto(QSqlDatabase::database("mydb"));
    query.clear();
    query.prepare("select `load` from axles where transitid=:transitid order by number");
    query.bindValue(":transitid",transitid);
    query.exec();
    while(query.next())
    {
        ui->AxleTreeWidget->item(0,i)->setText(query.value(0).toString());
        i++;
    }
    queryPhoto.clear();
    queryPhoto.prepare("select photo from transit where transitid=:id");
    queryPhoto.bindValue(":id",transitid);
    queryPhoto.exec();
    queryPhoto.first();
    QByteArray data=QByteArray::fromBase64(queryPhoto.value(0).toByteArray());
    picture.loadFromData(data);
    ui->PhotoLabel->setPixmap(picture);

}


Название: Re: query.exec Segmentation fault
Отправлено: gil9red от Март 30, 2014, 21:52
Код:
transitid=AllTransits->data(AllTransits->index(index.row(),0)).toInt();
Если index не валидный ( index.isValid() == false ), то произойдет крах :)


Название: Re: query.exec Segmentation fault
Отправлено: Old от Март 30, 2014, 21:55
А в таблице уже есть элементы, которые вы очищаете в начале?
index нужно проверять на валидность и выходить если он "плох".
Зачем делать clear для только что созданного QSqlQuery?


Название: Re: query.exec Segmentation fault
Отправлено: polina89 от Март 30, 2014, 22:21
Поставила проверку на валидность индекса. Индекс в итоге валидный. Вероятно, просто в отладчике он что-то не то показывает. То есть в строке
Код:
transitid=AllTransits->data(AllTransits->index(index.row(),0)).toInt();
я получаю нужное мне значение)
В таблице уже есть элементы.Они создаются в самом начале в конструкторе.
Убрала clear у обоих запросов. Теперь приложение вылетает не при исполнении запросов, а приблизительно при выходе из обработчика события. Но при всем при этом в якобы выполненных запросах нет никакие данных((( То есть отладчик выдает сообщение
QSqlQuery::value: not positioned on a valid record


Название: Re: query.exec Segmentation fault
Отправлено: Old от Март 30, 2014, 22:28
Проверяйте результат выполнения QSqlQuery::exec и в случае не успеха смотрите ошибку.


Название: Re: query.exec Segmentation fault
Отправлено: polina89 от Март 30, 2014, 22:39
В том-то и дело, что запрос выполнен, ошибки нет, да и данных тоже нет(


Название: Re: query.exec Segmentation fault
Отправлено: polina89 от Март 30, 2014, 22:49
И вот еще такая мистика...Программа работает через раз. То есть первый раз при нажатии на строку в QTableView все отлично, второй раз программа вылетает, третий раз опять все отлично(  :'( :'( :'(


Название: Re: query.exec Segmentation fault
Отправлено: Alex Custov от Март 30, 2014, 23:13
И вот еще такая мистика...Программа работает через раз. То есть первый раз при нажатии на строку в QTableView все отлично, второй раз программа вылетает, третий раз опять все отлично(  :'( :'( :'(

битая память налицо


Название: Re: query.exec Segmentation fault
Отправлено: polina89 от Март 30, 2014, 23:14
Я догадывалась о таком исходе, но отловить пока не получается(
Единственное, что смущает, так это то, что при отладке возникают вот такие сообщения. Практически с самого запуска программы.
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
can't find linker symbol for virtual table for `MainWindow' value
can't find linker symbol for virtual table for `MainWindow' value
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
can't find linker symbol for virtual table for `MainWindow' value
can't find linker symbol for virtual table for `MainWindow' value
can't find linker symbol for virtual table for `MainWindow' value
can't find linker symbol for virtual table for `MainWindow' value
can't find linker symbol for virtual table for `MainWindow' value
can't find linker symbol for virtual table for `MainWindow' value
can't find linker symbol for virtual table for `MainWindow' value
can't find linker symbol for virtual table for `MainWindow' value
can't find linker symbol for virtual table for `MainWindow' value
can't find linker symbol for virtual table for `MainWindow' value
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)
(Internal error: pc 0x0 in read in psymtab, but not in symtab.)

Как это расшифровать и постараться найти источник проблемы?)