Russian Qt Forum

Qt => Общие вопросы => Тема начата: Aleksey_Zh от Ноябрь 23, 2009, 16:30



Название: Избавляемся от ошибок
Отправлено: Aleksey_Zh от Ноябрь 23, 2009, 16:30
Имеется относительно работоспособное приложение, единственным недостатком которого является то, что при выходе из него возникает ошибка тянущая за собой предложение отправить отчет в мелкософт. Как можно избавиться от последнего? (Раньше писал на делфи, там была такая функция - SetErrorMode)


Название: Re: Избавляемся от ошибок
Отправлено: kuzulis от Ноябрь 23, 2009, 16:42
Это сегфаулт где-то :)
Ищите в коде. Возникает к примеру - если что-то удаляете уже удаленное/несуществующее или еще что-нибудь.
Или что-то не удаляется при завершении приложения.. Обычно с потоками такое бывает и т.п.


Название: Re: Избавляемся от ошибок
Отправлено: spectre71 от Ноябрь 23, 2009, 16:46
Имеется относительно работоспособное приложение, единственным недостатком которого является то, что при выходе из него возникает ошибка тянущая за собой предложение отправить отчет в мелкософт. Как можно избавиться от последнего? (Раньше писал на делфи, там была такая функция - SetErrorMode)

1) Если это твоя прога - то надо правиь ошибку!

2) SetErrorMode - не дельфийская, а виндовая!

MSDN:

UINT SetErrorMode(
  UINT uMode
);

Example:

#include <Windows.h>

SetErrorMode(SEM_NOGPFAULTERRORBOX | SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX);


Название: Re: Избавляемся от ошибок
Отправлено: Aleksey_Zh от Ноябрь 24, 2009, 09:48
Спасибо за ответы. Прога моя, но где глюк искать - не знаю. Имеется объект типа QSqlDataBase. Подключение производится нормально, запросы выполняются. Но после выхода из проги - краш. Комментирую работу с базой - краш пропадает.


Название: Re: Избавляемся от ошибок
Отправлено: Prm от Ноябрь 24, 2009, 11:51
А перед завершением программы соединение с базой закрываете?


Название: Re: Избавляемся от ошибок
Отправлено: Aleksey_Zh от Ноябрь 24, 2009, 11:58
Проьовал по-разному. Выносил закрытие базы в отдельный пункт меню - вылетало на нем. Если не делал закрытие - ошибка появлялась на выходе из программы. Когда убирал работу с базой - ошибка не возникала вовсе.


Название: Re: Избавляемся от ошибок
Отправлено: DmP от Ноябрь 24, 2009, 12:48
Проьовал по-разному. Выносил закрытие базы в отдельный пункт меню - вылетало на нем. Если не делал закрытие - ошибка появлялась на выходе из программы. Когда убирал работу с базой - ошибка не возникала вовсе.
Если валится при закрытии БД, то не обязательно ошибка в этом месте, возможно что ранее удалили что то лишний раз, или где то вылезли за пределы массива.


Название: Re: Избавляемся от ошибок
Отправлено: ax от Ноябрь 24, 2009, 13:03
перед зарытием сделай всем активным QSqlQuery clear()


Название: Re: Избавляемся от ошибок
Отправлено: Igors от Ноябрь 24, 2009, 13:24
Проьовал по-разному. Выносил закрытие базы в отдельный пункт меню - вылетало на нем. Если не делал закрытие - ошибка появлялась на выходе из программы. Когда убирал работу с базой - ошибка не возникала вовсе.
Тогда и "закатчить" к месту
Код:
bool closeError = false;
try {
// закрываем базу
...
}
catch (...) {
 closeError = true;
}
Это не значит что можно не исправлять  :)


Название: Re: Избавляемся от ошибок
Отправлено: spectre71 от Ноябрь 24, 2009, 13:54
Проьовал по-разному. Выносил закрытие базы в отдельный пункт меню - вылетало на нем. Если не делал закрытие - ошибка появлялась на выходе из программы. Когда убирал работу с базой - ошибка не возникала вовсе.
Тогда и "закатчить" к месту
Код:
bool closeError = false;
try {
// закрываем базу
...
}
catch (...) {
 closeError = true;
}
Это не значит что можно не исправлять  :)

сегфаулт - так не поймать!


Название: Re: Избавляемся от ошибок
Отправлено: Aleksey_Zh от Ноябрь 24, 2009, 14:07
Для проверки оставлял только коннект к базе. Все запросы отключены. Голый коннект. Исправлять больше нечего :). Коннект есть - есть ошибка. Коннекта нет - все в норме.


Название: Re: Избавляемся от ошибок
Отправлено: spectre71 от Ноябрь 24, 2009, 14:21
Для проверки оставлял только коннект к базе. Все запросы отключены. Голый коннект. Исправлять больше нечего :). Коннект есть - есть ошибка. Коннекта нет - все в норме.

Сделай тестовое приложение только с твоим соединением и расссоединением с базой, больше ничего, никаких левых обработок.
И проверь есть ли ошибка.


Название: Re: Избавляемся от ошибок
Отправлено: lit-uriy от Ноябрь 24, 2009, 14:46
Aleksey_Zh, у тебя приложение случаем не консольное?


Название: Re: Избавляемся от ошибок
Отправлено: Aleksey_Zh от Ноябрь 24, 2009, 14:51
Это приложение и является тестовым. Запросы я делал для проверки работоспособности драйвера БД. Когда убедился в работоспособности - я все лишнее убрал. Сейчас приложение содержит только коннект к базе данных. Дисконнект я так же убрал (предварительно проверив) Когда пытаешься сделать дисконнект - происходит такая же ошибка.


Название: Re: Избавляемся от ошибок
Отправлено: spectre71 от Ноябрь 24, 2009, 14:54
Это приложение и является тестовым. Запросы я делал для проверки работоспособности драйвера БД. Когда убедился в работоспособности - я все лишнее убрал. Сейчас приложение содержит только коннект к базе данных. Дисконнект я так же убрал (предварительно проверив) Когда пытаешься сделать дисконнект - происходит такая же ошибка.

Код в студию!


Название: Re: Избавляемся от ошибок
Отправлено: Aleksey_Zh от Ноябрь 24, 2009, 15:13
    ui->setupUi(this);
    this->setWindowFlags(Qt::WindowStaysOnTopHint);

    QSqlDatabase TMB;

    TMB = QSqlDatabase::addDatabase("QMYSQL");
    TMB.setDatabaseName("tmse");

    if (!TMB.open()) {
           QMessageBox::critical(0, "RealtorPlus", 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);
     
    } else {
    QMessageBox::information(0,"","подключился");
   


Название: Re: Избавляемся от ошибок
Отправлено: Igors от Ноябрь 24, 2009, 15:17
сегфаулт - так не поймать!
Никто не говорил что это сегфаулт, может кто-то испустил  throw. А если и сегфаулт - то только лучше - он обычно хорошо виден в отладчике.  Вообще, Алексей, что пишет консоль, что показывает отладчик? Без этого гадать можно очень долго.


Название: Re: Избавляемся от ошибок
Отправлено: Aleksey_Zh от Ноябрь 24, 2009, 15:24
AppName: testmysqlembedded.exe    AppVer: 0.0.0.0    ModName: libmysqld.dll
ModVer: 0.0.0.0    Offset: 00051f79

Это выдает винда.

D:\QTProjects\TestMySqlEmbedded\release\TestMySqlEmbedded.exe exited with code -1073741819

это выдается в консоли


Название: Re: Избавляемся от ошибок
Отправлено: Aleksey_Zh от Ноябрь 24, 2009, 15:48
Прошу прощения, не заметил сообщение от lit-uriy.
Нет, приложение не консольное. Обычное Qt4 Gui Application


Название: Re: Избавляемся от ошибок
Отправлено: spectre71 от Ноябрь 24, 2009, 16:04
сегфаулт - так не поймать!
Никто не говорил что это сегфаулт, может кто-то испустил  throw. А если и сегфаулт - то только лучше - он обычно хорошо виден в отладчике.  Вообще, Алексей, что пишет консоль, что показывает отладчик? Без этого гадать можно очень долго.

Qt классы не испускают throw, так что не поможет.


Название: Re: Избавляемся от ошибок
Отправлено: SimpleSunny от Ноябрь 24, 2009, 16:11
Возможно проблема в том, что объект QSqlDatabase TMB; создается в конструкторе формы, и после выхода из него (конструктора) будет уничтожен, попробуй вынести объявление в *.h файл.


Название: Re: Избавляемся от ошибок
Отправлено: lit-uriy от Ноябрь 24, 2009, 16:13
>>объект  QSqlDatabase TMB ... будет уничтожен
а он потом и не нужен, соединение с БД (QSqlDatabase) устроено как "именованный одиночка" т.е. информация хранится в статических членах этого класса.


Название: Re: Избавляемся от ошибок
Отправлено: uriel от Ноябрь 24, 2009, 16:16
Если есть возможность собрать под Linux'ом, то попробуйте прогнать через valgrind.
А вообще правильно посоветовали: запустите под отладчиком и в месте сегфолта посмотрите состояние стека вызовов.


Название: Re: Избавляемся от ошибок
Отправлено: Igors от Ноябрь 24, 2009, 16:21
AppName: testmysqlembedded.exe    AppVer: 0.0.0.0    ModName: libmysqld.dll
ModVer: 0.0.0.0    Offset: 00051f79

Это выдает винда.

D:\QTProjects\TestMySqlEmbedded\release\TestMySqlEmbedded.exe exited with code -1073741819

это выдается в консоли
Ну на этом далеко не уехать. "Консоль" имеется ввиду "консоль отладчика"


Название: Re: Избавляемся от ошибок
Отправлено: spectre71 от Ноябрь 24, 2009, 16:49
    ui->setupUi(this);
    this->setWindowFlags(Qt::WindowStaysOnTopHint);

    QSqlDatabase TMB;

    TMB = QSqlDatabase::addDatabase("QMYSQL");
    TMB.setDatabaseName("tmse");

    if (!TMB.open()) {
           QMessageBox::critical(0, "RealtorPlus", 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);
     
    } else {
    QMessageBox::information(0,"","подключился");
   

Я не вижу в приведенном коде ошибки которая приводит к описанному падению.
Вероятно ошибка возникает в подгружаемых dll(sql драйверов), может стоит их переинсталлять?


Название: Re: Избавляемся от ошибок
Отправлено: SASA от Ноябрь 24, 2009, 18:44
Надо запуститься в дебаге, а не гадать на кофейной гуще.
З.Ы. Вот все ругают студию, а такие ошибки показыват без всяких valgrind, и колстек покажет, и значение переменных.


Название: Re: Избавляемся от ошибок
Отправлено: uriel от Ноябрь 24, 2009, 19:11
Понимаю, что отчасти оффтоп, поэтому сразу З.Ы. :)
Так с отладочной информацией тебе в теории любой отладчик такое выдаст.
Проблема-то как правило не в этом. Одно дело локализовать место падения, а другое - определить причины, которые к этому падению привели. И вот здесь уже valgrind может подсказать, что именно пошло не так: обращение по неправильному адресу, неинициализированный указатель, двойное освобождение памяти и так далее.


Название: Re: Избавляемся от ошибок
Отправлено: Alex Custov от Ноябрь 24, 2009, 19:23
Надо запуститься в дебаге, а не гадать на кофейной гуще.
З.Ы. Вот все ругают студию, а такие ошибки показыват без всяких valgrind, и колстек покажет, и значение переменных.

ну это любой нормальный отладчик покажет, а valrgind не отладчик :)


Название: Re: Избавляемся от ошибок
Отправлено: Mikhail от Ноябрь 24, 2009, 19:42
Откомпилировал твой код и удивлен твоим вопросом.
Никаких ошибок не возникло.

Проверял на  Qt 4.5.3, MSVC 2008 Express


Название: Re: Избавляемся от ошибок
Отправлено: Aleksey_Zh от Ноябрь 25, 2009, 10:15
Я и сам удивляюсь падению. На обычном мускуле все работало нормально. Думаю что могут быть проблемы в libmysqld.dll - в версии 5.1.40 на офф сайте указано, что библиотека переделывалась. Есть насчет этого какие - либо мнения?


Название: Re: Избавляемся от ошибок
Отправлено: Aleksey_Zh от Ноябрь 25, 2009, 10:20
P.S. В дебаг версии кстати тоже самое выдается что и в релизе. Никаких отличий


Название: Re: Избавляемся от ошибок
Отправлено: Aleksey_Zh от Ноябрь 25, 2009, 16:03
Всем кто помогал мне в решении моей проблемы большое спасибо!!!! Проблема решена. Как и предпологал - загвоздка оказалась в библиотеке libmysqld.dll, поставляемой в сборке 5.1.40. Так что 5 часов потраченных на очередную пересборку и перекомпиляцию Qt не прошли даром.


Название: Re: Избавляемся от ошибок
Отправлено: Aleksey_Zh от Ноябрь 26, 2009, 08:42
Народ, я вчера сильно поторопился с выводами. Ошибка не пропала!!! Просто переставил qt на вирт машину с win sp3 (на основном компе - sp2). При компиляции код завершения приложения такой же -1073741819. Просто окошко ругательное не выдает...


Название: Re: Избавляемся от ошибок
Отправлено: Mikhail от Ноябрь 26, 2009, 14:33
Как компилировал Qt: версия Qt, компилятор, параметры confiure?


Название: Re: Избавляемся от ошибок
Отправлено: Aleksey_Zh от Ноябрь 30, 2009, 10:33
Qt SKD_2009.04 компилил статически под mingw
configure -static -opensource -debug-and-release -qt-sql-mysql -qt-gif -qt-libpng -qt-libtiff -webkit 


Название: Re: Избавляемся от ошибок
Отправлено: Aleksey_Zh от Декабрь 02, 2009, 09:27
02.12.09 - пересобрал Qt SDK 2009.02 с поддержкой mysqld. Пересборку делал абсолютно идентичную той, что была произведена на 2009.04. Получил работоспособную версию. У кого - нибудь еще были проблемы с 04 SDK?