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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Sigsegv на выходе  (Прочитано 14538 раз)
Aleksey_Zh
Гость
« : Март 18, 2010, 09:32 »

Наверно уже флужу - похожую тему создавал месяца 3-4 назад. Но результата так и не получил. Так что решил попросить помощи по-новой.
Проблема такова - сделал сборку на базе SDK2009.02 (Qt 4.5.1) с поддержкой локального mysql - все отлично работает. Но когда решил перевести свой проект на более поздние версии Qt - столкнулся с проблемой - при выходе из программы система шлет сообщение что пойман SigSegv, и приложение вылетает с ошибкой.
Моя система - SDK2010.02.01 (в принципе перепробовал все системы начиная с SDK 2009.03 до вышеуказанной). ОС - Windows SP2/SP3. mingw. ВЕРСИЯ СОБРАНА СТАТИЧЕСКИ.

Пробовал с разными версиями mysql - 5.1.39, 5.1.40.
Пробовал менять компилятор - не срослось.

Мои шаманские танцы с бубном навели на мысль, что глюк возникает при закрытии соединения с базой данных.
Если понадобится, код программы - вышлю по требованию.
« Последнее редактирование: Март 18, 2010, 11:38 от Aleksey_Zh » Записан
BRE
Гость
« Ответ #1 : Март 18, 2010, 09:55 »

А что после падения в стеке возврата находиться?

Мои шаманские танцы с бубном навели на мысль, что глюк возникает при закрытии соединения с базой данных.
Если понадобится, код программы - вышлю по требованию.
Покажи, как ты соединение С БД создаешь, как используешь и как закрываешь?
Где выполняется работа с БД, в главном потоке или нет?
Записан
Aleksey_Zh
Гость
« Ответ #2 : Март 18, 2010, 10:52 »

Код:
QSqlDatabase TMB;

void MainWindow::on_pushButton_clicked()
{
    TMB = QSqlDatabase::addDatabase("QMYSQL");
    TMB.setDatabaseName("tmse");


    if (!TMB.open()) {
         QMessageBox::critical(this, "", qApp->tr("Cannot open database.\n"
                                "Unable to establish a database connection.\n"
                     "Perhaps Qt was built without database support.\n\n"
                     "Click Cancel to exit."), QMessageBox::Cancel);

    }


}


Закрытие повесил на отдельную кнопку (если ее не трогать - крашит в конце программы, есмли нажать - краш на ней)

P.S. там 2 файла - в одном стек команд, во втором - код, на который меня скинул отладчик
P.P.S. Последняя команда (выполнял по шагам) - QMysqlDriver::close().
« Последнее редактирование: Март 18, 2010, 11:32 от Aleksey_Zh » Записан
BRE
Гость
« Ответ #3 : Март 18, 2010, 11:41 »

Закрытие повесил на отдельную кнопку (если ее не трогать - крашит в конце программы, есмли нажать - краш на ней)
Ну так код ее покажи.  Улыбающийся

Для чего ты соединение TMB описываешь глобально?
Не нужно этого, ты в любой момент можешь его получить используя QSqlDatabase::database().
« Последнее редактирование: Март 18, 2010, 11:43 от BRE » Записан
Aleksey_Zh
Гость
« Ответ #4 : Март 18, 2010, 11:57 »

if (TMB.isOpen())
        TMB.close();

это код моей кнопки.
Насчет Соединения - если я его опишу локально - разве на выходе из процедуры соединения он не уничтожится?

P.S. тоесть закрытие делать таким образом? :
Код:
QSqlDatabase::database("TMB",true).close();
« Последнее редактирование: Март 18, 2010, 12:02 от Aleksey_Zh » Записан
BRE
Гость
« Ответ #5 : Март 18, 2010, 12:14 »

Насчет Соединения - если я его опишу локально - разве на выходе из процедуры соединения он не уничтожится?
Нет, не уничтожит.
Записан
Aleksey_Zh
Гость
« Ответ #6 : Март 18, 2010, 12:19 »

Проверил. Данное выражение проглатывает. Но в конце все равно выдает SigSegv. Так что наверное дело не в том, что данное соединение глобальное. Просто на платформе 2009.02 - все работает и не ругается Грустный Я совсем запутался. Почему 2 версии собираемые одинаково работают абсолютно по-разному?

Очередной P.S. может быть в qsql_mysql.cpp и qsql_mysql.h - что-нибудь еще нужно закомментировать/раскомментировать при сборке драйвера помимо комментирования //# define Q_NO_MYSQL_EMBEDDED и preparedQuerysEnabled?Непонимающий??
« Последнее редактирование: Март 18, 2010, 12:29 от Aleksey_Zh » Записан
BRE
Гость
« Ответ #7 : Март 18, 2010, 12:47 »

Проверил. Данное выражение проглатывает. Но в конце все равно выдает SigSegv. Так что наверное дело не в том, что данное соединение глобальное. Просто на платформе 2009.02 - все работает и не ругается Грустный Я совсем запутался. Почему 2 версии собираемые одинаково работают абсолютно по-разному?

Очередной P.S. может быть в qsql_mysql.cpp и qsql_mysql.h - что-нибудь еще нужно закомментировать/раскомментировать при сборке драйвера помимо комментирования //# define Q_NO_MYSQL_EMBEDDED и preparedQuerysEnabled?Непонимающий??
Попробуй поработать с базой через этот драйвер используя демку SqlBrowser. Не просто посмотреть виден драйвер/не виден, а сделать запрос и т.д.
Посмотри, будет ли она падать при завершении работы.
И будет ясно, дело в драйвере или в твоем коде.
Записан
Aleksey_Zh
Гость
« Ответ #8 : Март 18, 2010, 12:59 »

Идея хорошая. Я уже думал об этом, но проблема в том, что для подключения к базе из под embedded сервера - нужно в своей программе сделать процедуру инициализации локального сервака. А как ее приделать к SQLBrowser - представления не имею (((
Записан
BRE
Гость
« Ответ #9 : Март 18, 2010, 13:05 »

Идея хорошая. Я уже думал об этом, но проблема в том, что для подключения к базе из под embedded сервера - нужно в своей программе сделать процедуру инициализации локального сервака. А как ее приделать к SQLBrowser - представления не имею (((
Сделай небольшое тестовое приложение, которое будет открывать базу, делать запрос и закрывать базу и проверь его с этим драйвером.
Ошибка может быть связана с порчей памяти, причем эта порча может быть где-то совершенно в другом месте, а проявляться при закрытии.
Записан
Aleksey_Zh
Гость
« Ответ #10 : Март 18, 2010, 13:09 »

 Улыбающийся Так тот код, который я в самом начале указывал - он и был из тестового приложения. Коннект делал так же как в основной программе. Запрос - на выборку самый элементарный. + закрытие. Все работало нормально, только закрытие глючит. Отсюда на драйвер и грешу.

Есть идеи, что дальше можно сделать?
« Последнее редактирование: Март 18, 2010, 14:10 от Aleksey_Zh » Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #11 : Март 18, 2010, 15:23 »

Посмотреть по стеку на чем падает и дальше думать
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Aleksey_Zh
Гость
« Ответ #12 : Март 19, 2010, 08:49 »

Привет pastor! Если я все правильно понял - то содержимое стека при краше таково -
Код:
0	ntdll!RtlPcToFileHeader	C:\WINDOWS\system32\ntdll.dll	0	0x7c926fd9	
1 msvcrt!free C:\WINDOWS\system32\msvcrt.dll 0 0x77c1c2de
2 ?? 0 0x08e90000
3 ?? 0 0x00000000

Если не туда глянул - поправьте меня. Все это добро получил при пошаговом режиме.

З.Ы. Народ, кто сам собирал мускуль локально, откликнитесь!!!!!!!!!!! Очень нужна ваша помощь!!!!!!
« Последнее редактирование: Март 19, 2010, 09:07 от Aleksey_Zh » Записан
Tonal
Гость
« Ответ #13 : Март 19, 2010, 10:12 »

У тебя статически собрана прога с Qt и MySql Embedded - т. е.  всё в один екзешник?
Тогда пересобери с отладкой и запусти через gdb.

Да, версии 3их либ используемых и в Qt и в MySql совпадают и используют одну и ту же библиотеку?
Например zlib-а?
Записан
Aleksey_Zh
Гость
« Ответ #14 : Март 19, 2010, 10:25 »

Программа действительно собрана статически. Собирал в дебажной версии. Как запустить через gdb - не представляю. Если не трудно, намекните, как, а я сделаю  Улыбающийся.

Цитировать
Да, версии 3их либ используемых и в Qt и в MySql совпадают и используют одну и ту же библиотеку?
Например zlib-а?

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


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