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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: query.exec Segmentation fault  (Прочитано 8562 раз)
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}
Записан
Nidxogg
Гость
« Ответ #1 : Март 30, 2014, 18:20 »

Цитировать
QSqlDatabase::database("mydb")
Само подключение к базе открыто?
Многопоточное приложение?
Записан
polina89
Гость
« Ответ #2 : Март 30, 2014, 18:37 »

Код:
QSqlDatabase::database("mydb").isOpen();
непосредственно перед выполнением запроса возвращает true. То есть подключение к БД активно. Приложение многопоточное, но так сказать не везде. То есть обновление БД ведется в отдельном потоке и при получении данных по сети создаются дополнительные потоки. Конкретно в этом месте обработка идет в главном потоке.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Март 30, 2014, 18:52 »

Для каждого потока делайте свое подключение.
Записан
polina89
Гость
« Ответ #4 : Март 30, 2014, 20:32 »

Но ведь эта часть обрабатывается в главном потоке. Этот кусок отрабатывает в самом начале работы программы. То есть в этот момент никаких других потоков кроме главного по идее еще не запущено.Но за совет спасибо!Буду иметь в виду Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #5 : Март 30, 2014, 20:40 »

Но ведь эта часть обрабатывается в главном потоке. Этот кусок отрабатывает в самом начале работы программы. То есть в этот момент никаких других потоков кроме главного по идее еще не запущено.Но за совет спасибо!Буду иметь в виду Улыбающийся
Попробуйте скопировать этот кусок и создание подключения в отдельный тестовый проектик. И проверите, если будет падать в том же месте, то выкладывайте его сюда, а если не будет, то где то раньше (не в этом месте) вы что то делаете не так.
Записан
polina89
Гость
« Ответ #6 : Март 30, 2014, 21:03 »

В тестовом проекте все работает. ГрустныйКак можно раскопать, где ошибка? Я в таком случае даже не имею представления, с чего начать((((Ну то есть я комментирую отдельные участки кода, в надежде, что ошибка именно там.Но пока ничего не выходит(
« Последнее редактирование: Март 30, 2014, 21:12 от polina89 » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #7 : Март 30, 2014, 21:09 »

Как можно раскопать, где ошибка? Я в таком случае даже не имею представления, с чего начать((((
В таком случае, 90% что ошибка в битой памяти. Улыбающийся
Если есть возможность работать под linux, то запустите программу под valgrind.
Нет, пробуйте все за комментировать, потом по частям убирать комментарии и смотрите, когда начнет падать.

Записан
polina89
Гость
« Ответ #8 : Март 30, 2014, 21:16 »

Спасибо!Возможности запустить под linux нет( Пытаюсь как раз методом комментирования понять, где ошибка.Единственное, что заметила, что этот код у меня для вот этого слота:
Код:
void MainWindow::on_AllTableView_clicked(const QModelIndex &index)
{
   
}
То есть для обработки нажатия на строку в TableView. И при просмотре в отладчике я вижу, что значение index равно invalid.Может, как-то отсюда начать пляски с бубном Непонимающий
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #9 : Март 30, 2014, 21:25 »

Т.е. пока вы не нажмете кнопку, программа работает корректно, нормально завершается?

Ну такие вещи нужно обязательно проверять, или assert'ами или if ... return.
Записан
polina89
Гость
« Ответ #10 : Март 30, 2014, 21:30 »

Да, все верно)Пока не тыкну мышкой на строку, то все отлично.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #11 : Март 30, 2014, 21:30 »

Да, все верно)Пока не тыкну мышкой на строку, то все отлично.
Покажите весь метод.
Записан
polina89
Гость
« Ответ #12 : Март 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);

}
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #13 : Март 30, 2014, 21:52 »

Код:
transitid=AllTransits->data(AllTransits->index(index.row(),0)).toInt();
Если index не валидный ( index.isValid() == false ), то произойдет крах Улыбающийся
Записан

Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #14 : Март 30, 2014, 21:55 »

А в таблице уже есть элементы, которые вы очищаете в начале?
index нужно проверять на валидность и выходить если он "плох".
Зачем делать clear для только что созданного QSqlQuery?
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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