Application.exe has triggered a breakpoint Visual Studio 2015 "C++" +PlugIn Qt 5.7



  • Hallo zusammen,

    ich habe eine Application in C++ (Visual Studio 2015 + Qt 5.7 PlugIn) geschrieben.
    Von diese App haben ich eine Release/Debug Version erstellt.

    Die Release Version läuft einwandfrei.
    Bei der Debug Version bekomme ich immer die oben genannten Fehler ".exe has triggered a breakpoint".
    Codemässig unterscheiden die beide Version nicht von einander.

    Meine Frage:
    Hat jemenden Erfahrungen mit solche Fehlermeldung?

    Gleiche Projekt läuft auch unter VS 2008 und Qt4.8 und da ist alles (Debug&Release) Okay

    Danke in voraus


  • Moderators

    @Galilio

    Ist die Debug-Version dann im Debugger gestartet?



  • @koahnig said in Application.exe has triggered a breakpoint Visual Studio 2015 "C++" +PlugIn Qt 5.7:

    Ist die Debug-Version dann im Debugger gestartet?

    Ja



  • anbei einen Codeabschnitt, wo das Problem auftritt:
    Header File:

    class VisaAgilent: public QThread
    {
        public:
       
        typedef enum
        {
            enRspTimeout = -2,
            enRspOffline,
            enRspOK,
            enRspError
        } t_enRspType;
       
        VisaAgilent(QString strIpAdress_p, int iTimeout_p, bool boSimulate_p = false, bool boDebug_p = false);
        ~VisaAgilent();
        ...
        bool Open(const QString &strIpAdress_p, const int iTimeout_p);
        bool Close(const int iTimeout_p);
        t_enRspType Execute(const char *strCmd_p, const int iWaitResponse_p, const int iTimeout_p, const int iRspDelayed_p);
        ...
        protected:
        void run();
        private:
        QTcpSocket *m_pTcpSctCtrl;
    }
    

    cpp File:

    VisaAgilent::VisaAgilent(QString strIpAdress_p, int iTimeout_p, bool boSimulate_p, bool boDebug_p)
    {
     
       
        m_boDebug = boDebug_p;
        m_boSimulate = boSimulate_p;
     
        m_enRetVal = enRspOffline;
        m_strCtrlIP = QString("");
        m_iTimeout = 0;
        m_iTimeoutClose = iTimeout_p;
        if (this->Execute("CreateObject", 0, 0, 0) != enRspOK)
        {
            throw(QString("TcpSocket Create memory error"));
        }
     
        this->Open(strIpAdress_p, iTimeout_p);
    }
     
    VisaAgilent::~VisaAgilent()
    {
        while(isRunning());
     
        this->Close(m_iTimeoutClose);
     
        while(isRunning());
       
    }
     
    bool VisaAgilent::Open(const QString &strCtrlIP_p, const int iTimeout_p)
    {
        bool boRet_l = true;
     
        m_strCtrlIP = strCtrlIP_p;
           
        if (this->Execute("OpenConnection", 0, iTimeout_p, 0) != enRspOK)
        {
            throw(QString("Open TcpSocket Open Connection error"));
        }
       
        if (m_boDebug)
        {
            throw(QString("Tcp Socket is open"));
        }
     
        return boRet_l;
    }
     
    bool VisaAgilent::Close(const int iTimeout_p)
    {
        bool boRet_l = true;
     
        while(isRunning());
     
        if (this->Execute("CloseConnection", 500, iTimeout_p, 1000) != enRspOK)
        {
            throw(QString("Close Connection error"));
        }
       
        if (m_boDebug)
        {
            throw(QString("Tcp Socket is closed"));
        }
     
        while(isRunning());
     
        return boRet_l;
    }
     
    VisaAgilent::t_enRspType VisaAgilent::Execute(const char *strCmd_p, const int iWaitResponse_p, const int iTimeout_p, const int iRspDelayed_p)
    {
        VisaAgilent::t_enRspType enRetVal_l = enRspOffline;
     
        if (!isRunning())
        {
            m_ByteArrayRead.clear();
     
            m_ByteArrayWrite.clear();
            m_ByteArrayWrite.append(strCmd_p);
           
            m_iWaitResponse = iWaitResponse_p;
            m_iTimeout = iTimeout_p;
            m_iResponseDelayed = iRspDelayed_p;
     
            start(); // Thread Start
     
            m_MtxProcess.lock();
            m_WaitCondProcess.wait(&m_MtxProcess,-1);
            m_MtxProcess.unlock();
       
            enRetVal_l = this->m_enRetVal;
        }
        else
        {
            enRetVal_l = enRspError;
        }
       
        while(isRunning());
       
        return enRetVal_l;
    }  
     
    void VisaAgilent::run()
    {
        bool boRun_l = true;
        bool boSent_l = false;
     
        const char *pStrCmd_l = NULL;
        const char *pStrRsp_l = NULL;
     
        m_enRetVal = enRspError;
     
        if (strcmp(m_ByteArrayWrite.data(),"CreateObject")==0)
        {
            if (this->m_boSimulate == true)
            {
                m_enRetVal = enRspOK;
            }
            else
            {
                m_pTcpSctCtrl = (QTcpSocket *)new QTcpSocket;
                if (m_pTcpSctCtrl != NULL)
                {
                    m_enRetVal = enRspOK;
                }
            }
     
            boRun_l = false;
        }
     
        if (strcmp(m_ByteArrayWrite.data(),"DeleteObject")==0)
        {
            if (this->m_boSimulate == true)
            {
            }
            else
            {
                if (m_pTcpSctCtrl != NULL)
                {
                    delete m_pTcpSctCtrl;
                }
            }
     
            m_enRetVal = enRspOK;
            boRun_l = false;
        }
     
        if (strcmp(m_ByteArrayWrite.data(),"OpenConnection")==0)
        {
            if (this->m_boSimulate == true)
            {
                m_enRetVal = enRspOK;
            }
            else
            {
                m_pTcpSctCtrl->connectToHost(m_strCtrlIP,5025);
                if (m_pTcpSctCtrl->waitForConnected(m_iTimeout) == true)
                {
                    m_enRetVal = enRspOK;
                }
            }
           
            boRun_l = false;
        }
     
        if (strcmp(m_ByteArrayWrite.data(),"CloseConnection")==0)
        {
            if (this->m_boSimulate == true)
            {
                m_enRetVal = enRspOK;
            }
            else
            {
                m_pTcpSctCtrl->disconnectFromHost();
                if ((m_pTcpSctCtrl->state() == QAbstractSocket::UnconnectedState) || (m_pTcpSctCtrl->waitForDisconnected(m_iTimeout)))
                {
                    m_enRetVal = enRspOK;
                }
            }
           
            boRun_l = false;
        }
        .....
        }
    


  • Ich versuche hier wann und wie der oben genannten Fehler auftritt:
    ....
    Im laufe das Programm mache ich folgende:

    if(eine bestimmte Bedingung)
    {
        VisaAgilent reference(......);
        reference.ExecuteRUNControl(); // Task wird erfolgreich geschlossen
    }
    

    // wenn diesen Block "{}" verlassen wird, dann wird der Destruktor gerufen und der so ausieht:

     VisaAgilent::~VisaAgilent()
    {
        while(isRunning());
     
        this->Close(m_iTimeoutClose);
     
        while(isRunning());
       
        if (this->Execute("DeleteObject", 0, 0, 0) != enRspOK)
        {
            throw(QString("Destructor TcpSocket Delete memory error"));
        }
     
       
        while(isRunning());
    }
    

    dieser widerum ruft der close Methode, die so ausieht:

     bool VisaAgilent::Close(const int iTimeout_p)
    {
        bool boRet_l = true;
     
        while(isRunning());
     
        if (this->Execute("CloseConnection", 500, iTimeout_p, 1000) != enRspOK)
        {
            throw(QString("Close Connection error"));
        }
       
        if (m_boDebug)
        {
            throw(QString("Tcp Socket is closed"));
        }
     
        while(isRunning());
     
        return boRet_l;
    }
    

    dieser ruft wieder

    Execute(...)
    

    Methode und genau in diesem Methode
    nach der

    start()
    

    Aufruf kracht die SW, da die

    run()
    

    Methode nicht aufgerufen wird was normaleweise nicht der Fall ist.
    also

     run()
    

    muss immer automatische nach dem Aufruf von

    start()
    

    folgen.


  • Moderators

    @Galilio

    Ich kann dir hier nicht wirklich helfen, da ich MinGW verwende.

    Das Einzige, was ich mir vorstellen kann, wären "Ghost break points". Diese treten bei mir unter MinGW mit GDB regelmässig auf. Diese Break-Points sind nicht markiert als solche, aber wenn man versucht einen Break-Point dort zu setzen, muss man das zweimal machen. beim ersten Mal wird der Break-Point erst zurückgesetzt. Es ist also eine reine Anzeigesache.

    Ein anderes Problem habe ich beim Umschalten von Release- auf Debug-Modus. Das passt dann nicht automatisch zusammen und muss qmake nochmals laufen lassen. Keine Ahnung ob dies auf dein Problem anwendbar ist. Aber schaden sollte es nicht nochmals "run qmake" und anschliessend ein rebuild.



  • Hi,
    ich glaube ich bin auf eine heisse Spur.
    Der Thread wird irgendwie nicht richtig aufgeraumt und das ist glaube ich das Problem.

    Dazu habe ich eine technische Frage:
    Sei folgende:
    Header File:

    QTcpSocket *m_pTcpSctCtrl;	
    

    Cpp File:

    m_pTcpSctCtrl = (QTcpSocket *)new QTcpSocket;
    

    Darf ich so schreiben?
    danke


  • Moderators

    @Galilio said in Application.exe has triggered a breakpoint Visual Studio 2015 "C++" +PlugIn Qt 5.7:

    Cpp File:
    m_pTcpSctCtrl = (QTcpSocket *)new QTcpSocket;

    Darf ich so schreiben?

    Ich bin mir nicht ob du "dürfen" hier richtig anwendest. Bei "dürfen" und "müssen" gibt es zum Beispiel zwischen Englisch und Deutsch doch entscheidende Unterschiede, die zu Ungereimtheiten zwischen Muttersprachler und Nichtmuttersprachler führen.

    Du darfst schon, aber warum? Es sollte/muss auch ohne den cast funktionieren. Der wäre nur bei einer vererbten Klasse notwendig.



  • Hi Zusammen,

    Kann es sein, dass der Qt 5.7 einen Bug hat bzw. in der

    QTcpSocket 
    

    ?

    Danke in voraus


  • Moderators

    @Galilio

    Es wäre besser für jeden neuen Fall einen neuen Thread zu starten.

    Ich denke Fehler kann man nie ausschliessen. Allerdings solltest du mehr Details geben. So kann es niemand einstufen und dir eine richtige Antwort geben.

    Falls du nach einem Bug schauen möchtest, solltest du bei JIRA nachschauen. Dort sind alle bekannten Bugs eingetragen.



  • Eine Release Version läuft immer noch einwandfrei.
    Problem tritt nur bei Debug Version.

    Ich habe auch das gleiche Projekt unter Visual Studio 2008 mit Qt 4.8 Plugin und dort laufen beide Versionen Debug und Release einwandfrei.


  • Moderators

    @Galilio

    Wenn das Problem nur unter debug mit Qt 5.7 nicht richtig läuft aber als release Version richtig läuft, ist es sehr wahrscheinlich kein Bug bei Qt 5.7.



  • @koahnig
    Ja das denke ich auch aber ich habe ehrlich gesagt kein Plan.
    Mir ist immer noch unklar warum nur beim Debug Version das problem ist.
    Genau gesagt beim TCP


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.