Russian Qt Forum

Qt => Базы данных => Тема начата: Aleksey_Zh от Март 18, 2010, 09:32



Название: Sigsegv на выходе
Отправлено: 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.
Пробовал менять компилятор - не срослось.

Мои шаманские танцы с бубном навели на мысль, что глюк возникает при закрытии соединения с базой данных.
Если понадобится, код программы - вышлю по требованию.


Название: Re: Sigsegv на выходе
Отправлено: BRE от Март 18, 2010, 09:55
А что после падения в стеке возврата находиться?

Мои шаманские танцы с бубном навели на мысль, что глюк возникает при закрытии соединения с базой данных.
Если понадобится, код программы - вышлю по требованию.
Покажи, как ты соединение С БД создаешь, как используешь и как закрываешь?
Где выполняется работа с БД, в главном потоке или нет?


Название: Re: Sigsegv на выходе
Отправлено: Aleksey_Zh от Март 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().


Название: Re: Sigsegv на выходе
Отправлено: BRE от Март 18, 2010, 11:41
Закрытие повесил на отдельную кнопку (если ее не трогать - крашит в конце программы, есмли нажать - краш на ней)
Ну так код ее покажи.  :)

Для чего ты соединение TMB описываешь глобально?
Не нужно этого, ты в любой момент можешь его получить используя QSqlDatabase::database().


Название: Re: Sigsegv на выходе
Отправлено: Aleksey_Zh от Март 18, 2010, 11:57
if (TMB.isOpen())
        TMB.close();

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

P.S. тоесть закрытие делать таким образом? :
Код:
QSqlDatabase::database("TMB",true).close();


Название: Re: Sigsegv на выходе
Отправлено: BRE от Март 18, 2010, 12:14
Насчет Соединения - если я его опишу локально - разве на выходе из процедуры соединения он не уничтожится?
Нет, не уничтожит.


Название: Re: Sigsegv на выходе
Отправлено: Aleksey_Zh от Март 18, 2010, 12:19
Проверил. Данное выражение проглатывает. Но в конце все равно выдает SigSegv. Так что наверное дело не в том, что данное соединение глобальное. Просто на платформе 2009.02 - все работает и не ругается :( Я совсем запутался. Почему 2 версии собираемые одинаково работают абсолютно по-разному?

Очередной P.S. может быть в qsql_mysql.cpp и qsql_mysql.h - что-нибудь еще нужно закомментировать/раскомментировать при сборке драйвера помимо комментирования //# define Q_NO_MYSQL_EMBEDDED и preparedQuerysEnabled??????


Название: Re: Sigsegv на выходе
Отправлено: BRE от Март 18, 2010, 12:47
Проверил. Данное выражение проглатывает. Но в конце все равно выдает SigSegv. Так что наверное дело не в том, что данное соединение глобальное. Просто на платформе 2009.02 - все работает и не ругается :( Я совсем запутался. Почему 2 версии собираемые одинаково работают абсолютно по-разному?

Очередной P.S. может быть в qsql_mysql.cpp и qsql_mysql.h - что-нибудь еще нужно закомментировать/раскомментировать при сборке драйвера помимо комментирования //# define Q_NO_MYSQL_EMBEDDED и preparedQuerysEnabled??????
Попробуй поработать с базой через этот драйвер используя демку SqlBrowser. Не просто посмотреть виден драйвер/не виден, а сделать запрос и т.д.
Посмотри, будет ли она падать при завершении работы.
И будет ясно, дело в драйвере или в твоем коде.


Название: Re: Sigsegv на выходе
Отправлено: Aleksey_Zh от Март 18, 2010, 12:59
Идея хорошая. Я уже думал об этом, но проблема в том, что для подключения к базе из под embedded сервера - нужно в своей программе сделать процедуру инициализации локального сервака. А как ее приделать к SQLBrowser - представления не имею (((


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


Название: Re: Sigsegv на выходе
Отправлено: Aleksey_Zh от Март 18, 2010, 13:09
 :) Так тот код, который я в самом начале указывал - он и был из тестового приложения. Коннект делал так же как в основной программе. Запрос - на выборку самый элементарный. + закрытие. Все работало нормально, только закрытие глючит. Отсюда на драйвер и грешу.

Есть идеи, что дальше можно сделать?


Название: Re: Sigsegv на выходе
Отправлено: pastor от Март 18, 2010, 15:23
Посмотреть по стеку на чем падает и дальше думать


Название: Re: Sigsegv на выходе
Отправлено: Aleksey_Zh от Март 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

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

З.Ы. Народ, кто сам собирал мускуль локально, откликнитесь!!!!!!!!!!! Очень нужна ваша помощь!!!!!!


Название: Re: Sigsegv на выходе
Отправлено: Tonal от Март 19, 2010, 10:12
У тебя статически собрана прога с Qt и MySql Embedded - т. е.  всё в один екзешник?
Тогда пересобери с отладкой и запусти через gdb.

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


Название: Re: Sigsegv на выходе
Отправлено: Aleksey_Zh от Март 19, 2010, 10:25
Программа действительно собрана статически. Собирал в дебажной версии. Как запустить через gdb - не представляю. Если не трудно, намекните, как, а я сделаю  :).

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

Тут у меня с пониманием совсем туго. Даже не знаю, что и ответить. 3их либ - это что такое? И как проверить какие версии где используются?
Просьба та же - дайте целеуказание, как это все выполнить  :)


Название: Re: Sigsegv на выходе
Отправлено: Tonal от Март 21, 2010, 15:53
gdb - косольный отладчик для mingw.
Как использовать ищи сам там довольно просто, но описывать с0 мне лениво. :)

Про сторонние либы - как минимум zlib используется и в Qt, и в MySql. Нужно убедится, что используется одна и та же версия библиотеки (там еще может быть переопределен менеджер памяти).
Кроме того могут использоваться ещё и другие общие библиотеки...

Да, какая версия мингвы?


Название: Re: Sigsegv на выходе
Отправлено: Aleksey_Zh от Март 22, 2010, 08:51
Версия mingw - 3.81
zlib - 1.1.4(взял из zlib.h)  и в 2009.02 и в 2010.02 - так что проблема наверное не в ней...


Название: Re: Sigsegv на выходе
Отправлено: Tonal от Март 22, 2010, 12:31
gcc --version?

В Qt zlib - 1.1.4, так,
А в MySql какая версия?


Название: Re: Sigsegv на выходе
Отправлено: Aleksey_Zh от Март 22, 2010, 14:18
С версией zlib для mysql - сложнее. Перерыл все файлы находящиеся в мускулевском каталоге, нашел только zlib.lib. Lister ничего не дал. Notepad - тоже. Так что даже не знаю откуда и брать информацию.  :(

P.S. версия GCC  4.4.0


Название: Re: Sigsegv на выходе
Отправлено: Tonal от Март 22, 2010, 18:24
Какие ключики оптимизации?


Название: Re: Sigsegv на выходе
Отправлено: Aleksey_Zh от Март 23, 2010, 09:13
Using built-in specs.
Target: mingw32
Configured with: ../gcc-4.4.0/configure --enable-languages=c,ada,c++,fortran,java,objc,obj-c++ --disable-sjlj-exceptions --enable-share
d --enable-libgcj --enable-libgomp --with-dwarf2 --disable-win32-registry --enable-libstdcxx-debug --enable-version-specific-runtime-li
bs --prefix=/mingw --with-gmp=/mingw/src/gmp/root --with-mpfr=/mingw/src/mpfr/root --build=mingw32
Thread model: win32
gcc version 4.4.0 (GCC)


Название: Re: Sigsegv на выходе
Отправлено: Tonal от Март 23, 2010, 11:30
Я имел в виду с какими ключами приложение компилится. Ну и либы.

У gcc 4.4 есть ошибочка кодогенерации для win32 проявляющаяся при оптимизации уровня -O3 под процессоры поддерживающие sse2 (например pentium3 и выше).

Обойти её можно перейдя на более низкие уровни оптимизации -O2 или отрубив использование sse2 инструкций: -nosse2.


Название: Re: Sigsegv на выходе
Отправлено: Aleksey_Zh от Март 23, 2010, 16:02
LFLAGS        =        -no-sse2 -static -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mthreads -Wl -Wl,-subsystem,windows

LIBS        =        -L"d:\Qt\2010_02_1\qt\lib" -lmingw32 -lqtmaind -lQtSqld -lQtGuid -lmysqld -lgdi32 -lcomdlg32 -loleaut32 -limm32 -lwinmm -lwinspool -lmsimg32 -lQtCored -lkernel32 -luser32 -lshell32 -luuid -lole32 -ladvapi32 -lws2_32



При сборке Qt - sse2 я специально не отключал. Так что вполне возможно. На 2009.02 действительно другая версия gcc - 3.4.2 (mingw-special), так что попробую пересобрать с другими ключами систему, если не подойдет - с другой версией компилятора. Единственный вопрос - лучше поменять только gcc.exe или всю папку mingw заменить?

P.S. За совет - большое спасибо!!! Как сделаю - отпишусь  :)


Название: Re: Sigsegv на выходе
Отправлено: Tonal от Март 24, 2010, 08:16
Во флагах стоит отключение:
LFLAGS        =        -no-sse2...
Так что может и мимо...
Хотя попробовать стоит. :)

А чем и как собирал MySql?
Если он собран другой версией могут быть разнообразные глюки...


Название: Re: Sigsegv на выходе
Отправлено: Aleksey_Zh от Март 24, 2010, 08:25
Во флагах исключение ставил уже потом, чтобы потестить. Изначально его не было. Как мускуль собирал - немного позже пришлю трактат  :)


Название: Re: Sigsegv на выходе
Отправлено: Aleksey_Zh от Март 26, 2010, 14:21
Собрал версию с ключиком - no-sse2 - итог не изменился.


Название: Re: Sigsegv на выходе
Отправлено: Tonal от Март 30, 2010, 08:17
Попробуй пересобрать старой версией мингвы


Название: Re: Sigsegv на выходе
Отправлено: Aleksey_Zh от Март 31, 2010, 08:34
Пока идет перекомпиляция, хотел бы спросить - почему новая версия mingw не дружит со старой версией creator'а? Поменял всю папку с мингв - в итоге ошибки...

P.S.
В итоге все пересобрал, вручную перекомпилил проект - от ошибки не избавился.


Название: Re: Sigsegv на выходе
Отправлено: SABROG от Апрель 03, 2010, 19:25
В итоге все пересобрал, вручную перекомпилил проект - от ошибки не избавился.

Значит возвращаемся к debug версии программы и gdb. Смотрим опять на стек.


Название: Re: Sigsegv на выходе
Отправлено: Aleksey_Zh от Апрель 08, 2010, 14:49
Возникла еще 1 мысль - база создавалась на совсем старой версии. При переводе системы на новую версию mysql конвертация базы не проводилась. Как думаете - это может послужить причиной?