Название: 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; Закрытие повесил на отдельную кнопку (если ее не трогать - крашит в конце программы, есмли нажать - краш на ней) 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 версии собираемые одинаково работают абсолютно по-разному? Попробуй поработать с базой через этот драйвер используя демку SqlBrowser. Не просто посмотреть виден драйвер/не виден, а сделать запрос и т.д. Очередной P.S. может быть в qsql_mysql.cpp и qsql_mysql.h - что-нибудь еще нужно закомментировать/раскомментировать при сборке драйвера помимо комментирования //# define Q_NO_MYSQL_EMBEDDED и preparedQuerysEnabled?????? Посмотри, будет ли она падать при завершении работы. И будет ясно, дело в драйвере или в твоем коде. Название: 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 Если не туда глянул - поправьте меня. Все это добро получил при пошаговом режиме. З.Ы. Народ, кто сам собирал мускуль локально, откликнитесь!!!!!!!!!!! Очень нужна ваша помощь!!!!!! Название: 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 конвертация базы не проводилась. Как думаете - это может послужить причиной?
|