Sigsegv segmentation fault qt как исправить

I have a Qt program which displays the data it receives over UDP. It works fine for around 30 seconds but after a while it gives Segmentation Fault and crashes. This 30 seconds is also not fixed. ...

I have a Qt program which displays the data it receives over UDP.
It works fine for around 30 seconds but after a while it gives Segmentation Fault and crashes. This 30 seconds is also not fixed.

I used the debugger and got this:

Program received signal SIGSEGV, Segmentation fault.
0x003c6fd4 in ?? () from /usr/lib/libQtGui.so.4

Can anyone tell me where the error might be?

tro's user avatar

tro

6,7436 gold badges47 silver badges65 bronze badges

asked Mar 16, 2010 at 12:18

user269037's user avatar

1

It means your program has tried to access memory that doesn’t belong to it. Basically, you have a pointer that contains an invalid value somewhere in your code — a common source of this error is dereferencing a NULL pointer.

answered Mar 16, 2010 at 12:21

3

You need a debugger (and make sure you have binaries with debug information) — check the stack trace at the crash site. I’d pretty much assume your own code will appear somewhere, and this is the point to start with. Check allocations, buffer sizes …

answered Mar 16, 2010 at 12:23

Alexander Gessler's user avatar

Alexander GesslerAlexander Gessler

45.1k6 gold badges81 silver badges122 bronze badges

1

Make sure you have allocated array that you are assigning data to.

I have constantly had this error for not allocating.

Example I have used:

char* m_tempBuff;
*(int*) m_tempBuff = i;

Latter changed to, and it worked:

char m_tempBuff[sizeof(int)];
*(int*) m_tempBuff = i;

Best of luck! :)

answered Feb 19, 2014 at 14:37

user2587316's user avatar

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
void Widget::exportToExcel()
{
    
    bool error = true;
    for (int i = 0; i < list.count(); i++)
    {
        CheckTable* pWidget(qobject_cast<CheckTable*>(ui->table->cellWidget(i, 7)));
        if (pWidget)
            if (pWidget->checkBox->checkState())
            {
                   error = false;
                   break;
            }
    }
    if (!error)
    {
 
    QString path = QFileDialog::getExistingDirectory(0,
                          "Выберите путь для сохранения таблицы",
                                  "", QFileDialog::ShowDirsOnly);
    if (path == "" )
    {
        QMessageBox mbox;
        mbox.setText("Не выбран путь для сохранения. Отмена экспорта.");
        mbox.exec();
 
    }
    else
    {
   QDate cur_time = ui->calendar->selectedDate();
   date cur; cur.d = cur_time.day(); cur.m = cur_time.month(); cur.y = cur_time.year();
   path = path + QString("/Стаж сотрудников МО на ") + Time(cur) + ".xls" ;
 
 
    QByteArray      excel_code         = "UTF-8";
        QTextCodec *codec = QTextCodec::codecForName(excel_code);
        QTextCodec::setCodecForCStrings(codec);
        QAxObject *excel = new QAxObject("Excel.Application", this);
        //excel->dynamicCall( "SetVisible(bool)", true );
        QAxObject *workbooks = excel->querySubObject( "Workbooks()" );
        QAxObject* workbook = workbooks->querySubObject( "Add()" );
        QAxObject* Sheets = workbook->querySubObject( "Sheets" );
        QAxObject* Sheet;
        Sheet =Sheets->querySubObject( "Item(int)" ,3);
        Sheet->dynamicCall("Delete()");
        Sheet =Sheets->querySubObject( "Item(int)" ,2);
        Sheet->dynamicCall("Delete()");
        Sheet =Sheets->querySubObject( "Item(int)" ,1);
        Sheet->setProperty("Name","Seniority - стаж сотрудников");
        QAxObject *Cell;
 
        Cell = Sheet->querySubObject( "Cells(const QVariant&,const QVariant&)",
                                      QVariant(1),QVariant(1));
        Cell->dynamicCall( "SetValue(const QVariant&)", QVariant("ФИО:"));
        Cell = Sheet->querySubObject( "Cells(const QVariant&,const QVariant&)",
                                      QVariant(1),QVariant(2));
        Cell->dynamicCall( "SetValue(const QVariant&)", QVariant("Должность:"));
        Cell = Sheet->querySubObject( "Cells(const QVariant&,const QVariant&)",
                                      QVariant(1),QVariant(3));
        Cell->dynamicCall( "SetValue(const QVariant&)", QVariant("Нач. раб. в МО:"));
        Cell = Sheet->querySubObject( "Cells(const QVariant&,const QVariant&)",
                                      QVariant(1),QVariant(4));
        Cell->dynamicCall( "SetValue(const QVariant&)", QVariant("Иные периоды:"));
        Cell = Sheet->querySubObject( "Cells(const QVariant&,const QVariant&)",
                                      QVariant(1),QVariant(5));
        Cell->dynamicCall( "SetValue(const QVariant&)", QVariant("Дата включения:"));
        Cell = Sheet->querySubObject( "Cells(const QVariant&,const QVariant&)",
                                      QVariant(1),QVariant(6));
        Cell->dynamicCall( "SetValue(const QVariant&)", QVariant("Основание включения:"));
        Cell = Sheet->querySubObject( "Cells(const QVariant&,const QVariant&)",
                                      QVariant(1),QVariant(7));
        Cell->dynamicCall( "SetValue(const QVariant&)", QVariant("Фед. стаж:"));
        Cell = Sheet->querySubObject( "Cells(const QVariant&,const QVariant&)",
                                      QVariant(1),QVariant(8));
        Cell->dynamicCall( "SetValue(const QVariant&)", QVariant("Стаж в др. ОИВ:"));
        Cell = Sheet->querySubObject( "Cells(const QVariant&,const QVariant&)",
                                      QVariant(1),QVariant(9));
        Cell->dynamicCall( "SetValue(const QVariant&)", QVariant("Стаж в МО:"));
        Cell = Sheet->querySubObject( "Cells(const QVariant&,const QVariant&)",
                                      QVariant(1),QVariant(10));
        Cell->dynamicCall( "SetValue(const QVariant&)", QVariant("Всего стаж:"));
        Cell = Sheet->querySubObject( "Cells(const QVariant&,const QVariant&)",
                                      QVariant(1),QVariant(11));
        Cell->dynamicCall( "SetValue(const QVariant&)", QVariant("Предупреждение:"));
 
        // ширина столбцов
        QAxObject *rangec = Sheet->querySubObject( "Range(const QVariant&)",QVariant("A1"));
        QAxObject *razmer = rangec->querySubObject("Columns");
        razmer->setProperty("ColumnWidth",35);
        rangec = Sheet->querySubObject( "Range(const QVariant&)",QVariant("B1"));
        razmer = rangec->querySubObject("Columns");
        razmer->setProperty("ColumnWidth",20);
        rangec = Sheet->querySubObject( "Range(const QVariant&)",QVariant("C1"));
        razmer = rangec->querySubObject("Columns");
        razmer->setProperty("ColumnWidth",14);
        rangec = Sheet->querySubObject( "Range(const QVariant&)",QVariant("D1"));
        razmer = rangec->querySubObject("Columns");
        razmer->setProperty("ColumnWidth",15);
        rangec = Sheet->querySubObject( "Range(const QVariant&)",QVariant("E1"));
        razmer = rangec->querySubObject("Columns");
        razmer->setProperty("ColumnWidth",17);
        rangec = Sheet->querySubObject( "Range(const QVariant&)",QVariant("F1"));
        razmer = rangec->querySubObject("Columns");
        razmer->setProperty("ColumnWidth",22);
        rangec = Sheet->querySubObject( "Range(const QVariant&)",QVariant("G1"));
        razmer = rangec->querySubObject("Columns");
        razmer->setProperty("ColumnWidth",15);
        rangec = Sheet->querySubObject( "Range(const QVariant&)",QVariant("H1"));
        razmer = rangec->querySubObject("Columns");
        razmer->setProperty("ColumnWidth",15);
        rangec = Sheet->querySubObject( "Range(const QVariant&)",QVariant("I1"));
        razmer = rangec->querySubObject("Columns");
        razmer->setProperty("ColumnWidth",15);
        rangec = Sheet->querySubObject( "Range(const QVariant&)",QVariant("J1"));
        razmer = rangec->querySubObject("Columns");
        razmer->setProperty("ColumnWidth",15);
        rangec = Sheet->querySubObject( "Range(const QVariant&)",QVariant("K1"));
        razmer = rangec->querySubObject("Columns");
        razmer->setProperty("ColumnWidth",35);
 
        int count = 2;
 
        for (int i = 0; i < list.count(); i++)
        {
            CheckTable* pWidget(qobject_cast<CheckTable*>(ui->table->cellWidget(i, 7)));
            if (pWidget)
                if (pWidget->checkBox->checkState())
    {
 
            QString name;
            date time;
            date other_periods;
            date other_sen;
            date fed_sen;
            date all_sen;
            QDate cur_time = ui->calendar->selectedDate();
            date cur; cur.d = cur_time.day(); cur.m = cur_time.month(); cur.y = cur_time.year();
            date other_time;
            QString post;
            QString base;
 
            list[i].getBaseInc(base);
            list[i].getPost(post);
            list[i].getOtherTime(other_time.d, other_time.m, other_time.y);
            list[i].getName(name);
            list[i].getDate(time.d, time.m, time.y);
            list[i].getOtherPeriods(other_periods.d, other_periods.m, other_periods.y);
            list[i].getOtherSen(other_sen.d, other_sen.m, other_sen.y);
            list[i].getFedSen(fed_sen.d, fed_sen.m, fed_sen.y);
 
            all_sen = allSen(time, cur, other_periods, fed_sen, other_sen);
 
            date temp2; temp2.d = 0; temp2.m = 0; temp2.y = 0;
            if (cur.d>=time.d)
                temp2.d = cur.d - time.d;
            else
            {
                temp2.d = cur.d + 30 - time.d;
                cur.m--;
            }
            if (cur.m>=time.m)
                temp2.m += cur.m - time.m;
            else
            {
                temp2.m = cur.m + 12 - time.m;
                cur.y--;
            }
            temp2.y += cur.y - time.y;
 
            Cell = Sheet->querySubObject( "Cells(const QVariant&,const QVariant&)",
                                          QVariant(count),QVariant(1));
            Cell->dynamicCall( "SetValue(const QVariant&)", QVariant(QString(name)) );
            Cell = Sheet->querySubObject( "Cells(const QVariant&,const QVariant&)",
                                          QVariant(count),QVariant(2));
            Cell->dynamicCall( "SetValue(const QVariant&)", QVariant(QString(post)) );
            Cell = Sheet->querySubObject( "Cells(const QVariant&,const QVariant&)",
                                          QVariant(count),QVariant(3));
            Cell->dynamicCall( "SetValue(const QVariant&)", QVariant(QString(Time(time))) );
            Cell = Sheet->querySubObject( "Cells(const QVariant&,const QVariant&)",
                                          QVariant(count),QVariant(4));
            Cell->dynamicCall( "SetValue(const QVariant&)", QVariant(QString(Year(other_periods))) );
            Cell = Sheet->querySubObject( "Cells(const QVariant&,const QVariant&)",
                                          QVariant(count),QVariant(5));
            Cell->dynamicCall( "SetValue(const QVariant&)", QVariant(QString(Year(other_time))) );
            Cell = Sheet->querySubObject( "Cells(const QVariant&,const QVariant&)",
                                          QVariant(count),QVariant(6));
            Cell->dynamicCall( "SetValue(const QVariant&)", QVariant(QString(base)) );
            Cell = Sheet->querySubObject( "Cells(const QVariant&,const QVariant&)",
                                          QVariant(count),QVariant(7));
            Cell->dynamicCall( "SetValue(const QVariant&)", QVariant(QString(Year(fed_sen))) );
            Cell = Sheet->querySubObject( "Cells(const QVariant&,const QVariant&)",
                                          QVariant(count),QVariant(8));
            Cell->dynamicCall( "SetValue(const QVariant&)", QVariant(QString(Year(other_sen))) );
            Cell = Sheet->querySubObject( "Cells(const QVariant&,const QVariant&)",
                                          QVariant(count),QVariant(9));
            Cell->dynamicCall( "SetValue(const QVariant&)", QVariant(Year(temp2)) );
            Cell = Sheet->querySubObject( "Cells(const QVariant&,const QVariant&)",
                                          QVariant(count),QVariant(10));
            Cell->dynamicCall( "SetValue(const QVariant&)", QVariant(Year(all_sen)) );
            Cell = Sheet->querySubObject( "Cells(const QVariant&,const QVariant&)",
                                          QVariant(count),QVariant(11));
            Cell->dynamicCall( "SetValue(const QVariant&)", QVariant(noticeSen(all_sen, cur, list[i].notice_count)) );
            // форматирование по центру столбца C
            QString temp = QString("C") + QString::number(count);
            QAxObject *rangep = Sheet->querySubObject( "Range(const QVariant&)",QVariant(QString(temp)));
            rangep->dynamicCall("Select()");
            rangep->dynamicCall("HorizontalAlignment",-4131);
 
            count++;
  }
        }
        QAxObject *rangep = Sheet->querySubObject( "Range(const QVariant&)",QVariant(QString("A1")));
        rangep->dynamicCall("Select()");
        workbook->dynamicCall("SaveAs(const QVariant&,const QVariant&)",
                              QVariant(QString(path)),
                              QVariant(xlExcel8));
        workbook->dynamicCall("Close()");
        excel->dynamicCall("Quit()");
    }
    }
    else
    {
        QMessageBox mbox;
        mbox.setText("Не выбраны сотрудники для экспорта.");
        mbox.exec();
    }
    
 
}

This topic has been deleted. Only users with topic management privileges can see it.

  • I have a problem in my chat application ,I use sqlite to save users name and password , and a client /server architecture . The first window «login» is opened corretly but after login when the chat program begin the application is stopped , and the debugger shows this message :
    «l’inférieur a stoppé car il a reçu un signal du système d’exploitation

    Nom du signal : SIGSEGV

    signification du signal Segmentation fault «
    the debugger shows that the problem is on line 30 of «client.cpp» but I can not find the error!

  • this is my code :

    client.cpp:
    @#include «client.h»
    #include «ui_client.h»

    client::client(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::client)
    {
    ui->setupUi(this);
    QPixmap pix(«C:/Users/asma/Desktop/mychat/client/pic.png»);
    ui->label_4->setPixmap(pix);
    QPixmap pic(«C:/Users/asma/Desktop/mychat/client/chatt.png»);
    ui->label_6->setPixmap(pic);

    socket = new QTcpSocket(this);
    connect(socket, SIGNAL(readyRead()), this,SLOT(donneesRecues()));
    connect(socket, SIGNAL(connected()), this, SLOT(connecte()));
    connect(socket, SIGNAL(disconnected()), this,SLOT(deconnecte()));
    connect(socket, SIGNAL(error(QAbstractSocket::SocketError)),this, SLOT(erreurSocket(QAbstractSocket::SocketError)));
    tailleMessage = 0;
    

    }

    client::~client()
    {
    delete ui;
    }

    void client::on_boutonConnexion_clicked()
    {
    // On annonce sur la fenêtre qu’on est en train de se connecter
    ui-> listeMessages->append(tr(«<em>Tentative de connexion en cours…</em>»));
    ui-> boutonConnexion->setEnabled(false);
    socket->abort(); // On désactive les connexions précédentes s’il y en a
    socket->connectToHost(serveurIP->text(), serveurPort->value());
    // On se connecte au serveur demandé
    }

    void client::on_boutonEnvoyer_clicked()
    {
    QByteArray paquet;
    QDataStream out(&paquet, QIODevice::WriteOnly);
    // On prépare le paquet à envoyer
    QString messageAEnvoyer = tr(«<strong>») + pseudo->text() +tr(«</strong> : «) + message->text();
    out << (quint16) 0;
    out << messageAEnvoyer;
    out.device()->seek(0);
    out << (quint16) (paquet.size() — sizeof(quint16));
    socket->write(paquet); // On envoie le paquet
    ui-> message->clear(); // On vide la zone d’écriture du message
    ui->message->setFocus(); // Et on remet le curseur à l’intérieur
    }

    void client::on_message_returnPressed()
    {
    on_boutonEnvoyer_clicked();
    }
    void client::donneesRecues()
    {
    /* Même principe que lorsque le serveur reçoit un paquet :
    On essaie de récupérer la taille du message
    Une fois qu’on l’a, on attend d’avoir reçu le message entier (en se
    basant sur la taille annoncée tailleMessage)
    */
    QDataStream in(socket);
    if (tailleMessage == 0)
    {
    if (socket->bytesAvailable() < (int)sizeof(quint16))
    return;
    in >> tailleMessage;
    }
    if (socket->bytesAvailable() < tailleMessage)
    return;
    // Si on arrive jusqu’à cette ligne, on peut récupérer lemessage entier
    QString messageRecu;
    in >> messageRecu;
    // On affiche le message sur la zone de Chat
    ui->listeMessages->append(messageRecu);
    // On remet la taille du message à 0 pour pouvoir recevoir de futurs messages
    tailleMessage = 0;
    }
    // Ce slot est appelé lorsque la connexion au serveur a réussi
    void client::connecte()
    {
    ui->listeMessages->append(tr(«<em>Connexion réussie !</em>»));
    boutonConnexion->setEnabled(true);
    }
    // Ce slot est appelé lorsqu’on est déconnecté du serveur
    void client::deconnecte()
    {
    ui->listeMessages->append(tr(«<em>Déconnecté du serveur</em>»));
    }
    // Ce slot est appelé lorsqu’il y a une erreur
    void client::erreurSocket(QAbstractSocket::SocketError erreur)
    {
    switch(erreur) // On affiche un message différent selon l’erreur qu’on nous indique
    {
    case QAbstractSocket::HostNotFoundError:
    ui->listeMessages->append(tr(«<em>ERREUR : le serveur n’apas pu être trouvé. Vérifiez l’IP et le port.</em>»));
    break;
    case QAbstractSocket::ConnectionRefusedError:
    ui->listeMessages->append(tr(«<em>ERREUR : le serveur arefusé la connexion. Vérifiez si le programme «serveur» a bien été lancé. Vérifiez aussi l’IP et le port.</em>»));
    break;
    case QAbstractSocket::RemoteHostClosedError:
    ui->listeMessages->append(tr(«<em>ERREUR : le serveur a coupé la connexion.</em>»));
    break;
    default:
    ui->listeMessages->append(tr(«<em>ERREUR : «) + socket->errorString() + tr(«</em>»));
    }
    ui->boutonConnexion->setEnabled(true);
    }
    @

  • client.h
    @#ifndef CLIENT_H
    #define CLIENT_H

    #include <QDialog>
    #include<QtNetwork>
    #include<QtWidgets>
    #include»ui_client.h»
    namespace Ui {
    class client;
    }

    class client : public QDialog,private Ui::client
    {
    Q_OBJECT

    public:
    explicit client(QWidget *parent = 0);
    ~client();

    private slots:
    void on_boutonConnexion_clicked();

    void on_boutonEnvoyer_clicked();
    
    void on_message_returnPressed();
    void donneesRecues();
    void connecte();
    void deconnecte();
    void erreurSocket(QAbstractSocket::SocketError erreur);
    

    private:
    Ui::client *ui;
    QTcpSocket *socket; // Représente le serveur
    quint16 tailleMessage;
    };

    #endif // CLIENT_H
    @

  • login.h:
    @#ifndef LOGIN_H
    #define LOGIN_H

    #include <QMainWindow>
    #include<QtSql>
    #include<QDebug>
    #include<QFileInfo>
    #include<QDialog>
    #include»client.h»
    #include»inscription.h»

    namespace Ui {
    class login;
    }

    class login : public QMainWindow
    {
    Q_OBJECT

    public:
    explicit login(QWidget *parent = 0);
    ~login();
    QSqlDatabase mydb;
    bool connOpen()
    {
    mydb = QSqlDatabase::addDatabase(«QSQLITE»);
    mydb.setDatabaseName(«C:/sqlite/users.sqlite»);
    if(!mydb.open())
    {
    qDebug()<<«failed to open the database»;
    return false;
    }
    else
    {
    qDebug()<<«Connected…»;
    return true;
    }
    }
    void connClose()
    {
    mydb.close();
    mydb.removeDatabase(QSqlDatabase::defaultConnection);
    }

    private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();
    

    private:
    Ui::login *ui;
    };

    #endif // LOGIN_H
    @

  • login.cpp:
    @#include «login.h»
    #include «ui_login.h»

    login::login(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::login)
    {
    ui->setupUi(this);
    QPixmap pic(«C:/Users/asma/Desktop/mychat/client/login.png»);
    ui->label_4->setPixmap(pic);

    if(!connOpen())
        ui->label_3->setText("failed to open database");
    else
        ui->label_3->setText("Connected");
    

    }

    login::~login()
    {
    delete ui;
    }

    void login::on_pushButton_clicked()
    {
    QString username, password;
    username = ui->lineEdit_username->text();
    password = ui->lineEdit_password->text();

    if(!connOpen())
    {
        qDebug()<<"failed to open database";
        return;
    }
    connOpen();
    QSqlQuery qry;
    //qry.prepare("select * from users where pseudo = '"+username+"' and mot_de_passe = '"+password+"'");
    qry.prepare("select * from users where pseudo = :username and mot_de_passe = :password");
                qry.bindValue(":username",username);
                qry.bindValue(":password",password);
    if (qry.exec())
    {
        int count=0;
        while(qry.next())
        {
            count++;
        }
        if(count==1)
        {
            ui->label_3->setText("username and password are correct");
            connClose();
            this->hide();
            client c;
            c.setModal(true);
            c.exec();
        }
        if(count<1)
        {
            ui->label_3->setText("username and password incorrect , veuillez s'inscrir");
            connClose();
            this->hide();
            inscription Inscription;
            Inscription.setModal(true);
            Inscription.exec();
        }
    
    }
    else qDebug()<< qry.lastError();
    

    }

    void login::on_pushButton_2_clicked()
    {
    this->hide();
    inscription Inscription;
    Inscription.setModal(true);
    Inscription.exec();
    }
    @

  • Hi,
    As far as I know this error could be caused due to accessing a NULL POINTER of invalid memory.

  • Hi,
    As far as I know this error could be caused due to accessing a NULL POINTER or invalid memory.

  • What are type of listeMessages object? And are you initialize listeMessages?

  • Hi , listeMessages is a QTextBrowser

  • i have changed s.th and now the debugger shows me that the ploblem is on line 33 :
    socket->connectToHost(serveurIP->text(), serveurPort->value());

  • Hi,

    From the code you posted, neither serveurIP nor serveurPort are initialized

  • serveurIP is a QLineEdit ,serveurPort is a QDableSpinBox : both are inisialised in client.ui

  • Then, the calls should be

    @socket->connectToHost(ui->serveurIP->text(), ui->serveurPort->value());@

  • it’s ok i have solved this problem but now another error appaired it’s related with socket i will create another discussion . Thanx everybody for help :)

  • So what was the problem ?

    Since you solved it, please update the thread title prepending [solved] so other forum users may know a solution has been found :)

  • Hi ,the problem was on: «socket->connectToHost(ui->serveurIP->text(), ui->serveurPort->value()); » on this line I forget to put ui-> as you told me @SGaist , thanx for help.

  • What is strange is that this would compile, so I guess you have member variables with these names in your class ? If so remove you should remove them

  • Разрабатывал на днях класс древовидного списка CTree, как раз создавал конструктор копирования.
    Случайно забыл обнулить указатель в конструкторе копирования, что привело в дальнейшем к не всегда выпадающей ошибке доступа к памяти.
    Разработка велась в Qt Creator. И ошибка доступа памяти приходила сообщением от ОС в виде сигнала SIGSEGV.

    Свою ошибку я вычислил, после подробной пошаговой отладки приложения. Не обнулённый указатель был обнулён.

    SIGSEGV — сигнал, посылаемый процессу при попытке обращения к несуществующей памяти или обращения с нарушением прав доступа (Segmentation Fault).
    Данная ошибка может возникать при попытке обратиться к методу или члену по невалидному указателю, или при попытке обратиться к чужой области памяти.
    К ошибке доступа памяти SIGSEGV могут привести следующие примеры кода:

    // Пример 1. Не всегда может привести 
    // к вызову SIGSEGV (Segmentation Fault)
    myclass *ptr = new myclass;
    delete ptr;
    delete ptr;
    
    // Пример 2. Более вероятно, 
    // что сразу приведёт к SIGSEGV (Segmentation Fault)
    int *ptr = (int*)(0x000000000);
    delete ptr;
    

    Главной неприятностью этих ошибок является то, что программа может молча упасть, и вам будет не понятна причина падения, можно даже не заметить падение (В моём случае падал консольный тест, выполнялись не все тесты, но слов об ошибке не было), либо в виндовс ошибка может вызвать аварийное завершение вашего приложения вида

    Кстати, помимо ошибки доступа памяти (при работе с указателями), можно получить и ошибку математических вычислений. Такая ошибка сопровождается приходом сигнала SIGFPE. Самый простой пример — это деление на нуль:

    int x;
    x = 1/0;
    

    В этом случае также можно получить молчаливое или аварийное завершение программы. (Молчаливое завершение намного хуже, т.к. вы можете его попросту не заметить и ничего об этом не узнать).

    Как сделать так, чтобы программа не завершалась молча?

    Как перехватить ошибку доступа к памяти?
    Как перехватить деление на ноль?
    Ответ далее.

    Для этого надо перехватить сигналы SIGSEGV, SIGFPE. (Кстати, не все сигналы могут быть перехвачены, более подробную информацию можно найти в соответствующей справке по функции signal).

    За основу следующего примера был взят пример с «Обработка Segmentation Fault в C++».

    Перехват сигналов SIGSEGV, SIGFPE в C++:

    #include <windows.h>
    #include <signal.h>
    
    void handler_sigsegv(int signum)
    {
        MessageBoxA(NULL,"SIGSEGV Error!","POSIX Signal",MB_ICONSTOP);
        // открепить обработчик и явно завершить приложение
        signal(signum, SIG_DFL);
        exit(3);
    }
    
    void handler_sigfpe(int signum)
    {
        MessageBoxA(NULL,"SIGFPE Error!","POSIX Signal",MB_ICONSTOP);
        // открепить обработчик и явно завершить приложение
        signal(signum, SIG_DFL);
        exit(3);
    }
    
    void fall1()
    {
        int* p = 0x00000000;
        *p = 10;
    }
    void fall2()
    {
        int x;
        x = 1/0;
    }
    
    int main()
    {
        // установим наши обработчики на два сигнала
        signal(SIGSEGV, handler_sigsegv);
        signal(SIGFPE, handler_sigfpe);
    
        // вызовем одну из ошибок
        fall1();
        fall2();
    
        return 0;
    }
    

    Внимание: в документации описан перечень безопасных функций, которые можно безопасно вызвать из обработчика сигнала SIGSEGV. Также не следует продолжать выполнять какие-то критические действия, т.к. память уже повреждена (какие именно повреждения — неизвестно).

    Пример я компилировал в Qt Creator под операционной системой Windows, и он работал, ошибки отлавливались. Спасибо хабра-форуму, который подсказал решение этой проблемы. В результате работы примера, при возникновении ошибок, будут всплывать диалоговые окна, оповещающие об ошибке.

    Для перехвата исключения деления на ноль, можно использовать технологию SEH, но возможно она работает только для Windows. И она также может перехватить не все сигналы.

    По вопросам выделения памяти и «двойного» delete, можно почитать: http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.2

         После N-ного количества времени, потребовалось мне запустить одно приложение в Qt Creator’е (в ОС Windows XP) в режиме отладки. Как же я был неприятно удивлен, когда IDE поругалась на «Segmentation fault» и наотрез отказалось «дебажить» программу. Поначалу, казалось,что это результат несовместимости кода, набранного в более старой среде, и последней версии Qt SDK. Но программа прекрасно компилировалась и запускалась и в debug и release вариантах. Так «несовместимость версий» отпала, а вот таинственная «guard32.dll«, что загадочным образом подключалась к запускаемому приложению, просветила суть вещей :-).

           Путь к истине был долог и тернист, но не сломил он духа праведного :-) и, в итоге, привел к Comodo Firewall. А точнее к той его части, что отвечает за контроль запускаемых приложений. Т.о. отключив Проактивную защиту Comodo Firewall, можно добиться желанного — отладка в Qt Creator запускается без каких-либо предупреждений или ошибок. Но это явно «не наш метод», поскольку даже после отключения нужно еще и перезагрузить ПК — дабы выгрузились соответствующие процессы. К тому же, согласитесь, не для того ставили программу защиты, что бы ей потом не пользоваться ;-). Что же делать, спросите вы? Обратиться к настройкам Проактивной защиты фаервола и указать директории игнорирования проверки внедрения shell-кода. Для этого необходимо:

    1. Открыть главное окно Comodo Firewall и перейти на вкладку «Защита«.

    2. На вкладке «Защита» выбрать пункт меню «Настройки Проактивной защиты«.

    3. В открывшемся окне перейти на вкладку «Настройки контроля исполнения приложений«.

    4. На вкладке «Настройки контроля исполнения приложений» нажать кнопку «Исключения«.

    5. В открывшемся окне «Исключения» выбрать пункт меню «Добавить«=>»Обзор» (реализовано в виде кнопки).

    6. В открывшемся окне выбрать директорию в которой у вас находиться разрабатываемый проект (кстати, директории могут добавляться по маске, поэтому можно сразу добавить корневую директорию содержащую все ваши проекты Qt, например, «C:myQt_projects«). Обратите внимание, что для добавления директории ее нужно «перетащить» в секцию справа!

    7. Сохранить изменения. 

         Собственно, на этом манипуляции заканчиваются и можно возвращаться к работе в Qt Creator :-). Для тех же, у кого не стоит Comodo Firewall, но возникает аналогичная ситуация, рекомендую поэкспериментировать с установленными программами защиты (фаерволы, антивирусы, антитрояны и прочее) — в последнее время, очень часто, именно они становятся причинами «непонятных» ситуаций :-).

    Вводная

    C++ является «небезопасным» («unmanaged») языком, поэтому программы могут «вылетать» — аварийно завершать работу без сохранения данных пользователя, сообщения об ошибке и т.п. — стоит только, например, залезть в не инициализированную память. Например:

    void fall()
    {
      char * s = "short_text";
      sprintf(s,"This is very long text");
    }
    

    или

    void fall()
    {
      int * pointer = NULL;
      *pointer = 13;
    }
    

    Всем было бы лучше, если бы мы могли «отловить» падение программы — точно так же, как в java ловим исключения — и выполнить хоть что-то перед тем, как программа упадет (сохранить документ пользователя, вывести диалог с сообщением об ошибке и т.п.)

    Общего решения задача не имеет, так как C++ не имеет собственной модели обработки исключений, связанных с работой с памятью. Тем не менее, мы рассмотрим два способа, использующих особенности операционной системы, вызвавшей исключение.

    Способ 1: SEH

    Если Вы используете OS Windows в качестве целевой ОС и Visual C++ в качестве компилятора, то Вы можете использовать Structured Exception Handling — расширение языка С++ от Microsoft, позволяющее отлавливать любые исключения, происходящие в программе.

    Общий синтаксис обработки исключений выглядит следующим образом:

    __try
    {
      segfault1();
    }
    __except( condition1 )
    {
      // обработка исключения, если condition1 == EXCEPTION_EXECUTE_HANDLER.
      // в condition1 может (должен) быть вызов метода, проверяющего 
      //    тип исключения, и возвращающего EXCEPTION_EXECUTE_HANDLER 
      //    если тип исключения соответствует тому, что мы хотим обработать
    }
    __except( condition2 )
    {
      // еще один обработчик
    }
    __finally
    {
      // то, что выполнится если ни один из обработчиков не почешется
    }
    

    Вот «работающий пример» — «скопируй и вставь в Visual Studio»

    #include <stdio.h>
    #include <windows.h>
    #include <excpt.h>
    
    int memento() // обработка Segfault
    {
    	MessageBoxA(NULL,"Memento Mori","Exception catched!",NULL);
    	return 0;
    }
    
    void fall() // генерация segfault
    {
    	  int* p = 0x00000000;   
    	  *p = 13;
    }
    
    int main(int argc, char *argv[])
    {
    	__try
    	{
    		fall();
    	}
    	__except (EXCEPTION_EXECUTE_HANDLER)
    	{
    		memento();
    	}
    }
    

    Мне лично не удалось заставить заработать __finally (поэтому я и написал __except с кодом проверки, который всегда работает), но это, возможно, кривизна моих рук.

    Данная методика, при всей ее привлекательности, имеет ряд минусов:

    • Один компилятор. Одна ОС. Не «чистый С++». Если Вы хотите работать без средств MS — Вы не сможете использовать эту методику
    • Один поток — одна таблица. Если Вы напишете конструкцию из __try… __except, внутри __try запустите другой поток и, не выходя из __try второй поток вызовет segfault, то… ничего не произойдет, программа упадет «как обычно». Потому, что на каждый поток нужно писать отдельный обработчик SEH.

    Минусов оказалось настолько много, что приходится искать второе решение.

    Способ 2: POSIX — сигналы

    Способ рассчитан на то, что в момент падения программа получает POSIX-сообщение SIGSEGV. Это безусловно так во всех UNIX-системах, но это фактически так (хотя никто не гарантировал, windows — не posix-совместима) и в windows тоже.

    Методика простая — мы должны написать обработчик сообщения SIGSEGV, в котором программа совершит «прощальные действия» и, наконец, упадет:

    void posix_death_signal(int signum)
    {
    	memento(); // прощальные действия
            signal(signum, SIG_DFL); // перепосылка сигнала
    	exit(3); //выход из программы. Если не сделать этого, то обработчик будет вызываться бесконечно.
    }
    

    после чего мы должны зарегистрировать этот обработчик:

    signal(SIGSEGV, posix_death_signal);
    

    Вот готовый пример:

    #include <stdio.h>
    #include <stdio.h>
    #include <windows.h>
    #include <stdlib.h>
    #include <signal.h>
    
    
    int memento()
    {
    	int a=0;
    	MessageBoxA(NULL,"Memento mori","POSIX Signal",NULL);
    	return 0;
    }
    void fall()
    {
    	  int* p = 0x00000000; 
    	  *p = 13;
    }
    void posix_death_signal(int signum)
    {
    	memento();
    	signal(signum, SIG_DFL);
    	exit(3);
    }
    
    
    int main(int argc, char *argv[])
    {
    	signal(SIGSEGV, posix_death_signal);
    	fall();
    }
    

    В отличие от SEH, это работает всегда: решение «многопоточное» (вы можете уронить программу в любом потоке, обработчик запустится в любом случае) и «кроссплатформенное» — работает под любым компилятором, и под любой POSIX-совместимой ОС.

    От: Аноним

     
    Дата:  27.02.12 13:03
    Оценка:

    Добрый вечер!
    Проект нормально компилится в Qt, хочу запустить в режиме отладки, при запуске получаю следующее:

    Приложение остановлено, так как оно получило сигнал от операционной системы.
    Сигнал: SIGSEGV
    Назначение: Segmentation fault.

    При этом в VS2005 все нормально в режиме отладки.
    В чем может быть причина?

    От:

    romankr

     
    Дата:  27.02.12 14:32
    Оценка:

    Здравствуйте, Аноним, Вы писали:

    А>Добрый вечер!

    А>Проект нормально компилится в Qt, хочу запустить в режиме отладки, при запуске получаю следующее:

    А>Приложение остановлено, так как оно получило сигнал от операционной системы.

    А>Сигнал: SIGSEGV
    А>Назначение: Segmentation fault.

    А>При этом в VS2005 все нормально в режиме отладки.

    А>В чем может быть причина?

    Сегфолт любит вылазить при проблемах с подключаемыми dll (проверьте версии самих qt-библиотек и MSVCRT). А вообще, можно попробовать детальнее посмотреть дебаггером место сегфолта.

    От:

    velkin

    Удмуртия

    http://blogs.rsdn.org/effective/
    Дата:  27.02.12 15:36
    Оценка:

    Здравствуйте, Аноним, Вы писали:

    А>Добрый вечер!

    А>Проект нормально компилится в Qt, хочу запустить в режиме отладки, при запуске получаю следующее:

    А>Приложение остановлено, так как оно получило сигнал от операционной системы.

    А>Сигнал: SIGSEGV
    А>Назначение: Segmentation fault.

    wiki:Ошибка_сегментации

    Ошибка сегментации (англ. Segmentation fault или сокращённо segfault) — ошибка программного обеспечения, возникающая при попытке обращения к недоступным для записи участкам памяти либо при попытке изменения памяти запрещённым способом.


    А>При этом в VS2005 все нормально в режиме отладки.

    Без разницы, если сборка официальная (например, с mingw), значит дело в программе. VS 2005 очень лояльна в этом плане, многое не запрещает, но это не значит, что программа написана правильно.

    А>В чем может быть причина?

    Мало информации, по аналогии «А у меня автомобиль не ездит, в чём может быть причина?»

    Прочти википедию об ошибке сегментации. Запусти трассировку, если надо поставь точки прерывания, найди в какой строчке возникает ошибка. Она ведь не размыта, вот у тебя всё хорошо, следующий шаг, и segfault. Место определяется очень точно. И если не получится понять самостоятельно в чём там дело, тогда надо публиковать код. Но как бы общая идея сводится к тому, что твоя программа неправильно обращается к памяти. А там уже может быть всё что угодно, указатель на несуществующий объект, обращение не из того потока, и так далее.

    От: Аноним

     
    Дата:  27.02.12 16:58
    Оценка:

    Здравствуйте, velkin & romankr, Вы писали:

    Хочу сразу сказать — приложение отлично работает собранное как в vs2005, так и в mingw. Точку останова ставлю сразу на первой строке в main. Я просто не пойму если ошибка сегментации — так программа вообще не должна работать!

    V>Сегфолт любит вылазить при проблемах с подключаемыми dll (проверьте версии самих qt-библиотек и MSVCRT). А вообще, можно попробовать детальнее посмотреть дебаггером место сегфолта.

    dll-не использую, «чистый» проект с++, слинковано с 5 стат.библиотеками, которые в свою очередь, также собраны mingw.

    V>wiki:Ошибка_сегментации

    читал — бегло ничего подобного нет.

    А>>При этом в VS2005 все нормально в режиме отладки.



    V>Без разницы, если сборка официальная (например, с mingw), значит дело в программе. VS 2005 очень лояльна в этом плане, многое не запрещает, но это не значит, что программа написана правильно.

    программа 2-е сутки тестируется, лопатит тонну информации — без сбоев, а я ее в отладочной версии даже запустить не могу!

    V>Мало информации, по аналогии «А у меня автомобиль не ездит, в чём может быть причина?»

    согласен, я только пересел на Qt, вернее только пытаюсь. программа достаточно большая, даже не знаю, что выкладывать то

    V>Прочти википедию об ошибке сегментации. Запусти трассировку, если надо поставь точки прерывания, найди в какой строчке возникает ошибка.

    так я и не могу трассировку запустить!

    От:

    velkin

    Удмуртия

    http://blogs.rsdn.org/effective/
    Дата:  27.02.12 18:32
    Оценка:

    Здравствуйте, Аноним, Вы писали:

    А>Здравствуйте, velkin & romankr, Вы писали:


    А>Хочу сразу сказать — приложение отлично работает собранное как в vs2005, так и в mingw. Точку останова ставлю сразу на первой строке в main. Я просто не пойму если ошибка сегментации — так программа вообще не должна работать!

    Почему не должна, в некоторых случаях очень даже должна.

    А>dll-не использую, «чистый» проект с++, слинковано с 5 стат.библиотеками, которые в свою очередь, также собраны mingw.

    Посмотри соседнюю тему

    Автор: velkin
    Дата: 26.02.12

    , там был вопрос, как собрать статическую версию Qt, да ещё чтобы были исключения. Включил флаг -exceptions в configure.exe, проект в дебаге сразу стал вылетать с segmentation fault, причём в релизе отрабатывал исключение за милую душу. Чтобы он и в дебаге с отладчиком нормально работал и отвязался от библиотеки mingwm10.dll, убрал -mthreads. Так что ещё неизвестно, как у тебя скомпилированы эти 5 библиотек вместе с Qt. Я потому и упомянул про официальную сборку, они в этом не косячат, и если вылетел segfault, то хотя бы об используемых библиотеках думать не надо, и можно сосредоточиться на багах своей программы.

    От:

    velkin

    Удмуртия

    http://blogs.rsdn.org/effective/
    Дата:  27.02.12 19:22
    Оценка:

    Здравствуйте, Аноним, Вы писали:

    А>так я и не могу трассировку запустить!

    Ещё вспомнил, если не можешь запустить режим отладки, тогда последовательно отключай библиотеки и код их использующий. Или наоборот, проверь, вылетает ли у тебя чистый Qt в режиме отладки или нет, а потом добавляй библиотеки. Всё равно надо как-то определить на каком этапе происходит segfault.

    От:

    Steamus

    Беларусь

     
    Дата:  28.02.12 07:17
    Оценка:

    Здравствуйте, Аноним, Вы писали:

    А>Добрый вечер!

    А>Проект нормально компилится в Qt, хочу запустить в режиме отладки, при запуске получаю следующее:

    А>Приложение остановлено, так как оно получило сигнал от операционной системы.

    А>Сигнал: SIGSEGV
    А>Назначение: Segmentation fault.

    А>При этом в VS2005 все нормально в режиме отладки.

    А>В чем может быть причина?

    Была похожая ситуация. Отладчик не стартовал, а сваливался и показывал ассемблерный код. Точное сообщение уже не помню (под Win XP дело было). Причина была в сервисе аудио-карты под названием HsMgr.exe. Запущен он как системный сервис и его удаление позволило отладчику работать. Программа была простой, никакого отношения к работе с аудио не имела. Вывалиливалась в режиме отладки сразу на старте.

    …HsMgr.exe (32-bit) and HsMgr64.exe (64-bit) are services which provide the GX2.0 features. Under Vista, they also enable Direct sound 2D/3D/EAX for applications. So it is essential to have them running on your system. On older drivers, these files were named [CMGxMon.exe] and [CMGxMon64.exe]. Windows Vista tends to block some .EXE or .DLL files in ZIP files for security issues. This may cause program to stop responding, or Windows Vista may prompt you for permission to run these programs during boot up…

    От:

    velkin

    Удмуртия

    http://blogs.rsdn.org/effective/
    Дата:  28.02.12 15:05
    Оценка:

    Здравствуйте, Steamus, Вы писали:

    S>Здравствуйте, Аноним, Вы писали:

    S>Была похожая ситуация. Отладчик не стартовал, а сваливался и показывал ассемблерный код. Точное сообщение уже не помню (под Win XP дело было). Причина была в сервисе аудио-карты под названием HsMgr.exe. Запущен он как системный сервис и его удаление позволило отладчику работать. Программа была простой, никакого отношения к работе с аудио не имела. Вывалиливалась в режиме отладки сразу на старте.

    Под WinXP у меня Qt подобным образом отваливался из-за нового BitDefender’а, пришлось его снести. Думаю список нежелательных программ этим не ограничивается.

    Подождите ...

    Wait...

    • Переместить
    • Удалить
    • Выделить ветку

    Пока на собственное сообщение не было ответов, его можно удалить.

    Clever_1945

    Гость


    Всем добрый день.
    Компилирую программу через Qt Creator, ошибок при компиляции нет, а когда запускаю приложение через отладчик выдает сообщение.

    Приложение остановлено, так как оно получило сигнал от операционной системы
    Сигнал: SIGSEGV
    сообщение: Segmentation fault

    Помогите с проблемой пожалуйста=)


    Записан
    LisandreL

    Птица говорун
    *****
    Offline Offline

    Сообщений: 984

    Надо улыбаться

    Просмотр профиля


    Windows? Антивирус какой?


    Записан
    GreatSnake

    Джедай : наставник для всех
    *******
    Offline Offline

    Сообщений: 2921

    Просмотр профиля


    Windows? Антивирус какой?

    Откуда в windows POSIX-сигнал SIGSEGV?


    Записан

    Qt 5.11/4.8.7 (X11/Win)

    LisandreL

    Птица говорун
    *****
    Offline Offline

    Сообщений: 984

    Надо улыбаться

    Просмотр профиля


    Откуда в windows POSIX-сигнал SIGSEGV?

    Из MinGW, очевидно же. (Это если про Qt говорить, так и другие реализации есть, например тот же Cygwin.)
    Именно с такой ошибкой останавливается GNU debugger если некоторые антивирусы (например Comodo) не дают подцепиться к процессу.


    Записан
    Странник

    Гость


    ага, подтверждаю. Avast тоже одно время шалил.


    Записан
    sudo

    Гость


    Антивирус, виндовс… Зуб даю, доступ по нулевому указателю Веселый
    ТС, запускай отладчик и смотри, где падает


    Записан

    New issue

    Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

    By clicking “Sign up for GitHub”, you agree to our terms of service and
    privacy statement. We’ll occasionally send you account related emails.

    Already on GitHub?
    Sign in
    to your account


    Closed

    rtllxndr opened this issue

    Dec 21, 2015

    · 56 comments


    Closed

    Qt4 and Qt5 Segmentation faults

    #940

    rtllxndr opened this issue

    Dec 21, 2015

    · 56 comments

    Comments

    @rtllxndr

    Windows 7 64, msys2 x86-64

    MSYS ~
    $ pacman -Ss mingw-w64-i686-qt4
    mingw32/mingw-w64-i686-qt4 4.8.7-3 (mingw-w64-i686-qt4) [installed]

    MINGW32 ~
    $ assistant.exe

    The window appears briefly.

    Segmentation fault
    MINGW32 ~
    $ strace -f assistant

    — Process 9132 loaded C:WindowsSysWOW64shell32.dll at 0000000006530000
    — Process 9132 unloaded DLL at 0000000006530000
    — Process 9132, exception c0000005 at 0000000001801DC7
    — Process 9132 thread 11520 exited with status 0xc0000005
    — Process 9132 thread 5672 exited with status 0xc0000005
    — Process 9132 thread 3252 exited with status 0xc0000005
    — Process 9132 thread 6804 exited with status 0xc0000005
    — Process 9132 thread 5960 exited with status 0xc0000005
    — Process 9132 thread 4524 exited with status 0xc0000005
    — Process 9132 exited with status 0xc0000005
    Segmentation fault
    If I enter $ strace -f assistant few more times, sometime it starts. And crashes when I click anything
    Later I installed qt5. Assistant does not work. Designer does not work either. (Qt4 designer works)
    Does msys2 support Qt?

    @rtllxndr
    rtllxndr

    changed the title
    CRASH (mingw32 qt4) assistant.exe Segmentation fault

    mingw32 assistant.exe Segmentation fault

    Dec 21, 2015

    @rtllxndr
    rtllxndr

    changed the title
    mingw32 assistant.exe Segmentation fault

    mingw32 assistant.exe Segmentation fault Qt4 and Qt5

    Dec 21, 2015

    @rtllxndr
    rtllxndr

    changed the title
    mingw32 assistant.exe Segmentation fault Qt4 and Qt5

    Qt4 and Qt5 Segmentation faults

    Dec 21, 2015

    @DavidEGrayson



    Copy link


    Sponsor


    Contributor

    I can verify that the problem affects the 32-bit Qt5 package. Here is my shell session:

    $ pacman -Qo /mingw32/bin/assistant.exe
    /mingw32/bin/assistant.exe is owned by mingw-w64-i686-qt5 5.5.1-2
    $ /mingw32/bin/assistant.exe
    Segmentation fault
    

    @mingwandroid

    Does msys2 support Qt?

    Yes. A crash in one program on one architecture doesn’t imply lack of support for a package. For Qt4, I personally don’t support it since I’ve made a decision to not devote any time to it (as the Qt packages take a lot of time).

    @saghul

    I just reinstalled msys2 and nothing Qt4 seems to run for me. Code that I used to build just fine no longer works.

    Sadly I have no idea where to begin to track this down.

    @Alexpux

    Well it can be as openssl update issue. Currently I try to update Qt to 5.6.0. Be patient — qt take many time.

    @saghul

    @Alexpux oh, you mean the OpenSSL upgrade somehow broke Qt4 and 5? Good to hear, I’ll wait then!

    @saghul

    FWIW, this is the crash I get when trying to run the assistant:

    Thread 1 received signal SIGSEGV, Segmentation fault.
    0x01611c60 in ZN18QWebPluginDatabase11qt_metacallEN11QMetaObject4CallEiPPv ()
       from C:msys32mingw32binQtWebKit4.dll
    

    I get the same crash when running my own application.

    @Alexpux

    Try to downgrade openssl and see if it solve issue

    @saghul

    I tried to rebuild the qt4 package, but it doesn’t properly build, I’m digging. I guess that it’s possible that the qt4 package needs to be rebuilt for the latest runtime?

    @Alexpux

    what error of rebuilding?

    @saghul

    @Alexpux first error was when installing pkgconfig files, because the target directory didn’t exist. I modified the PKGBUILD file to do that, but the dlls don’t get insalled in the generated package file. I’m rebuilding again, as I specified -c by mistake so I’m not sure where the files where…

    @bagong

    Fwiw, I also have a segfault with an application using msys2. Used to work until the switch to gcc5. On linux the applications builds/works fine with gcc5.2. If somebody would like to try and track down the problem, I am happy to try along…

    @saghul

    Sigh, no dice. After compiling qt4 with the i686 toolchain the package doesn’t contain the dll or exe files, they are in pkg/mingw-w64-qt4, and not in mingw-w64-i686-qt4. At any rate, I installed them manually but I still get the same crash I mentioned here.

    Next I’ll try to downgrade OpenSSL. @Alexpux what would be the right way to downgrade OpenSSL? Thanks.

    @Alexpux

    Download previous package manually from server or look into cache. Then install it with «pacman -U «

    @saghul

    @Alexpux Tried but no dice, same result. I’ll try to rebuild all of the dependencies tomorrow and see if I get anywhere…

    @Alexpux

    Try also downgrade binutils to 2.25.1 and rebuild your app

    @saghul

    @Alexpux

    then I wonder. I don’t have crashes. What program you build?

    @saghul

    I’m trying to run assistant.exe. Does it not crash for you with a fresh install of the toolchain on i686? It consistently does for me and apparently others.

    @Alexpux

    Yeah I see i686 only crashes. Will check tomorrow if it crash on 5.6.0

    @Alexpux

    Do you have small test case for crash?

    @saghul

    The fact that you can also reproduce it is reassuring :-)

    @Alexpux

    Well debugging Qt is not trivial task so need to find smaller example

    @Alexpux

    As assistant from Qt linked with release Qt libraries there are not much info about crash:

    Thread 1 received signal SIGSEGV, Segmentation fault.
    0x66ac5857 in ZN7QObject7connectEPKS_PKcS1_S3_N2Qt14ConnectionTypeE ()
       from c:buildingmsys64mingw32binQt5Core.dll
    (gdb) bt
    #0  0x66ac5857 in ZN7QObject7connectEPKS_PKcS1_S3_N2Qt14ConnectionTypeE ()
       from c:buildingmsys64mingw32binQt5Core.dll
    #1  0x02cd2729 in ZN7WebCore19initializeWebCoreQtEv ()
       from c:buildingmsys64mingw32binQt5WebKit.dll
    #2  0x0028f87c in ?? ()
    #3  0xec815356 in ?? ()
    #4  0x0000015c in ?? ()
    #5  0x8b0c5d8b in ?? ()
    #6  0x7d8b1075 in ?? ()
    #7  0x74db8514 in ?? ()
    #8  0x74ff8513 in RPCRT4!NdrMesTypeAlignSize ()
       from C:Windowssyswow64rpcrt4.dll
    Backtrace stopped: previous frame inner to this frame (corrupt stack?)
    (gdb)
    

    @bagong

    Another parallel: my application is also i686!

    @saghul

    @saghul

    I’m out of ideas, I’m afraid :-( If any of you have suggestions on what I can try I’ll be happy to do so.

    @0x414c

    For me, QtCreator (v. 3.6.1, 32- and 64-bit) started to crash with Segmentation fault after upgrading these packages (see pacman.log).

    Every time when I’m trying to open a project, QtCreator starts parsing it and crashes (see last lines in gdb_run.log). It’s seems to be not project-specific, fresh-created empty project will also crash QtCreator. I tried to reinstall MSYS2 from scratch, it didn’t help.

    Assistant works fine without any crashes.
    Official build of QtCreator (v. 3.6.1) works flawlessly.

    pacman_log.txt
    gdb_run.txt
    gdb_backtrace.txt

    @Alexpux

    I see it my own too. Try to figure what cause it.

    @0x414c

    Downgraded entire GCC suite (mingw-w64-x86_64-gcc-*) from 5.3.0-4 to 5.3.0-2 — now QtCreator works without any crash.

    @Alexpux

    Yes, probably this is new binutils issue or mingw-w64 last commits. Try bisect issue

    @0x414c

    I think the problem is in mingw-w64-x86_64-gcc-libs-5.3.0-4 package. libstdc++-6.dll from 5.3.0-4 causes QtCreator to crash, but 5.3.0-2 works fine.

    @Alexpux

    Problem not in gcc because you downgrade to gcc-5.3.0 toolchain. Problem is in how it builded seems.

    @0x414c

    Yep, the problem is not in GCC itself, it is only in the one dll library that supplied with the toolchain.

    @Alexpux

    At the end problem in buggy binutils-2.26. Tomorrow will upload reverted binutils-2.25.1 and rebuilded gcc packages.

    @saghul

    Unfortunately I still have the issue I reported. I installed MSYS2 from scratch with all upgrades and qt4 for i686. The gcc-libs package that got pulled is 5.3.0-5, but assistant.exe still segfaults upon invocation.

    @Alexpux

    Yeah, I solve only qtcreator crash. Others need to be researched. I have no time right now to do anything in this direction.

    @saghul

    No problem, but please reopen this issue, as it’s not fixed.

    @bagong

    Maybe the wrong place to post this, but just in case, I am getting this atm, when updating:

     msys is up to date
    :: Starting core system upgrade...
     there is nothing to do
    :: Starting full system upgrade...
    warning: mingw-w64-i686-binutils: local (2.26-22) is newer than mingw32 (2.25.1-4)
    warning: mingw-w64-x86_64-binutils: local (2.26-22) is newer than mingw64 (2.25.1-4)
     there is nothing to do
    

    @Alexpux

    I’m fix today WIKI where says that you need run pacman -Syuu to update MSYS2.
    As sometimes we downgrade packages due to its stability/buggy you need pass uu to allow pacman downgrade packages.

    @bagong

    @GamePad64

    Well, I have an issue (segfault) with Qt5.6, too. The problem persists only on i686 version of Qt. x86_64 works fine. Qt5.5 worked fine both on i686 and x86_64.

    @hyOzd

    I’m trying to compile my program using 32bit qt5-static. I can successfully build but I get a segmentation fault when I run the program. Could this issue related to my problem?

    Ps: when I open my executable in dependency walker, I shows that my 32 bit exe is linked to 64 bit libraries??

    @mati865

    @hyOzd I assume 64-bit qt5-static is fine? I’ve also had problems with 32-bit qt5-static.

    @hyOzd

    @mati865 just tested it, 64bit works fine.

    @mati865

    I was even recompiling Qt5-static 32-bit with _debuggable_release=yes but it didn’t help.

    @eighttails

    With latest gcc5.4 and Qt5.6.1, 32bit qt5-static still crashing in simple example like qtbaseexampleswidgetsmainwindowsmenus.
    debug version works fine.

    @mati865

    Pretty much every app using Qt5-static 32 bit Release crashes.

    @bcampbell

    Hmm, this sounds a lot like the issue I ran into: msys2/MSYS2-packages#672
    (sorry, I think I might have reported that in the wrong reposiotry — I’m a bit unclear on which packages belong where!)

    @mingwandroid

    We ‘fixed’ the qt5-static i686 problem a while back (just by upgrading to GCC 6). The problem is to do with -Os, but I do not have time to figure out the exact details. -Os is often problematic.

    @bcampbell

    Ahh — I was using the non-static version… will keep digging.

    @hyOzd

    I’ve just built my software with 32 bit qt5-static and it works fine. Issue seems to be resolved.

    @Alexpux

    Понравилась статья? Поделить с друзьями:

    Читайте также:

  • Sigsegv error code
  • Setup settings error cmos checksum error or cmos battery loss occurs default settings loaded
  • Signtool error файл не имеет цифровой подписи
  • Setup repair offline как исправить
  • Signtool error signedcode sign returned error 0x800700c1

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии