1 Востаннє редагувалося Betterthanyou (06.09.2016 18:38:48)

Тема: Qt "вилітає" програма

Ось код, і я навіть знаю чого програма вилітає (не постійно а через раз), в тому винний код що починається з 8 рядка, це запит який має створити новий запис в БД, але я не розумію чому так стається ? Як виправити це баг ?

categoryNew::categoryNew(QWidget *parent) :
    category(parent)
{
    ui = new Ui::category;
    ui->setupUi(this);
    this->setWindowModality(Qt::WindowModality::ApplicationModal);

    if( sqlQuery->exec( this->textQuery ) )
    {
        lastId = sqlQuery->lastInsertId().toString();
    }
    else
    {
        lastId = "-1";
    }
}
як я дізнався що саме у 8 рядку проблема

Я закоментував все з 8 по 15 рядок і декілька раз відкрив вікно categoryNew, програма працювала без "вилетів"
Problem signature

Problem signature:
  Problem Event Name:    APPCRASH
  Application Version:    0.0.0.0
  Application Timestamp:    00000000
  Fault Module Name:    ntdll.dll
  Fault Module Version:    6.2.9200.16384
  Fault Module Timestamp:    5010ae7a
  Exception Code:    c0000005
  Exception Offset:    00061233
  OS Version:    6.2.9200.2.0.0.256.48
  Locale ID:    1058
  Additional Information 1:    5861
  Additional Information 2:    5861822e1919d7c014bbb064c64908b2
  Additional Information 3:    dac6
  Additional Information 4:    dac6c2650fa14dd558bd9f448e23afd1

2

Re: Qt "вилітає" програма

Схоже, при створенні sqlQuery чи textQuery виникають проблеми. Гляньте, як і де вони створюються.

Подякували: Betterthanyou1

3 Востаннє редагувалося Betterthanyou (06.09.2016 20:28:54)

Re: Qt "вилітає" програма

Прихований текст

koala написав:

Схоже, при створенні sqlQuery чи textQuery виникають проблеми. Гляньте, як і де вони створюються.

sqlQuery

class category : public QMainWindow
{
...
protected:
    QSqlQuery *sqlQuery;
}
category::category(QWidget *parent) :
    QMainWindow(parent),
    sqlQuery(new QSqlQuery)
{}

textQuery

class categoryNew : public category
{
...
private:
    const QString textQuery = "INSERT INTO category(_isFixed_, _sum_, _currentProfileId_) VALUES('false', 0, 0)";
};

Нагадую що програма через раз "вилітає", а не постійно

4

Re: Qt "вилітає" програма

Я добавив ще такий код на кнопку Скасувати ( щойно, коли цього коду не було то так само програма "вилітала" )

void categoryNew::on_pushButtonCancel_clicked()
{
    if( lastId != "-1" )
        sqlQuery->exec( "DELETE FROM category WHERE _id_=" + lastId );
    this->close();
}

А ось відео щоб було більше зрозуміліше


Перший раз програма вилетіла коли й натиснув "Нова категорія", а інший раз коли я натиснув "Скасувати"
То що це може бути ?

5

Re: Qt "вилітає" програма

Нагадує анекдот "Допоможіть! Не можу зареєструватися на форумі виникає помилка "Цей логін вже занятий" щоб це значило?"  :D
koala ж написав, обгорніть sqlQuery->exec в try except і подивіться що за помилка виникає. Є такі речі як гарантії безпеки програмування, строгі, базові..

life is too short to remove usb safely
Подякували: Betterthanyou1

6 Востаннє редагувалося Torbins (07.09.2016 12:14:36)

Re: Qt "вилітає" програма

Та що тут гадати? c0000005 - Access Violation (Segmentation fault). В даному випадку це звертання до не ініціалізованого sqlQuery. Ставите бряку на восьмий рядок і на створення sqlQuery, і дивитеся, яка спрацює перша. Можете ще значення sqlQuery глянути. Там буде null або якесь сміття.

Подякували: Betterthanyou, Arete, leofun013

7 Востаннє редагувалося Betterthanyou (07.09.2016 15:14:15)

Re: Qt "вилітає" програма

Я не використовую try тому що в документації написано Qt itself will not throw exceptions, я обгортав і sqlQuery і конструктор повністю (це на відео видно) не разу не спрацював блок catch(...).
А try-except, я його раніше не використовував, ось попробував і в мене появилися не зрозумілі мені синтаксичні помилки

__try{

        if( sqlQuery->exec("INSERT INTO category(_isFixed_, _sum_, _currentProfileId_) VALUES('false', 0, " +
                           getCurrentProfileId + ")") )
        {
            lastId = sqlQuery->lastInsertId().toString();
        }
        else
        {
            lastId = "-1";
        }
    }
    __except( expression )
    {
        qDebug() << "Debug";
    }

error: expected 'catch' before '__except' __except( expression )
error: expected '(' before '__except'

і ін. подібні
Як try-except користуватися ?
qDebug() << sqlQuery->lastError().text(); - теж нічого (навіть пустих ласок " " як зазвичай коли не має помилки) не показує
Як не дивно, але скільки я не запускав програму в режимі debugging не разу вона не зламалась, ось я зняв відео.


І ще одне, я компілюю на MinGW, я так подумав скомпілюю на microsoftськом компіляторі, скомпілював, і "вильоти" програми пропали. Але я не можу робити свою програму так, бо MinGW підтримує windows XP а microsoftтський компіляторі ні. Що мені робити ?

8

Re: Qt "вилітає" програма

А який сенс запускати прогу в режимі дебагера, і не користуватися дебагером? Перевірити, чи вплине це на розподіл пам'яті в програмі? Звісно вплине, але бага від цього не зникне, просто її не буде видно.
Невеличка стаття, якщо іще не дружите з дебагером: http://doc.crossplatform.ru/qtcreator/1 … gging.html

Подякували: Betterthanyou, leofun012

9

Re: Qt "вилітає" програма

Прихований текст
В мене всерівно не вийшло, мені навіть кажеться що це баг MinGW
Я напишу пізніше, всім дякую хто допомагав