Application.exe has triggered a breakpoint Visual Studio 2015 C++



  • Hallo zusammen,

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

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

    Meine Fragen:
    Hat jemenden Erfahrungen mit solche Fehlermeldung unter Visual Studio?
    Ist das eine Visual Studio Einstellung?

    Danke in voraus





  • das heißt ziemlich sicher nicht, dass MSVC was falsch macht sondern du was. klingt nach UB.
    musst du den debugger nehmen, durchsteppen und gucken, wo was schiefgeht und dann denkst du nach, was dort falsch gehen könntest / googelst / fragst noch mal nach (in der reihenfolge).
    bei der meldung hast du übrigens auch "unterbrechen" oder so was zur auswahl und solltest den callstack dann direkt sehen können...

    bb



  • Hat jemenden Erfahrungen mit solche Fehlermeldung unter Visual Studio?

    wohl jeder hier - aber das bekommst du auch unter anderen IDEs/Kompiler hin

    Ist das eine Visual Studio Einstellung?

    nein - es ist wohl ein fieser Fehler in deinem Code der undefiniertes Verhalten verursacht - der Breakpoint wird dann wohl irgendwo in der ntdll oder sowas angezeigt

    Poste mal Code



  • Ich habe die gleiche App auch unter Visual Studio (C++)2008 und dort habe der Effekt nicht.



  • Saheb schrieb:

    Ich habe die gleiche App auch unter Visual Studio (C++)2008 und dort habe der Effekt nicht.

    Das ist das Gemeine an UB = Undefined Behaviour.

    VG



  • Das ist das Gemeine an UB = Undefined Behaviour.

    Es kann alles passieren - und sich auch immer wieder ändern - kein stabiles Verhalten - es kann Wochenlang richtig laufen und dann nur noch abstürzen - und dann wieder Monate laufen usw. - alles völlig normal

    Deswegen vermeidet man UBs - kodiert also einfach richtig

    du musst Code posten sonst kann dir keiner sagen wo es herkommt



  • Hier einen Codeabschnitt:

    Ich habe folgende class:

    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;
    	}
    	.....
    	}
    




  • könnte dann auch mit Threadprobleme zu tun haben

    was soll das?

    m_MtxProcess.lock(); 
            m_WaitCondProcess.wait(&m_MtxProcess,-1); 
            m_MtxProcess.unlock();
    


  • Beim Object create ist alles Okay.
    Problem ist wenn ich das Object schliessen möchte "CloseConnection" und genau gesagt beim:

    VisaAgilent::t_enRspType VisaAgilent::Execute(const char *strCmd_p, const int iWaitResponse_p, const int iTimeout_p, const int iRspDelayed_p)
    {
    ....
    start(); // Thread start
    ...
    }
    

    Thread landet ne in diesem Stand beim:

    void VisaAgilent::run()
    {
      .....
        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;
        }
    .....
    }
    


  • Gast3 schrieb:

    könnte dann auch mit Threadprobleme zu tun haben

    was soll das?

    m_MtxProcess.lock(); 
            m_WaitCondProcess.wait(&m_MtxProcess,-1); 
            m_MtxProcess.unlock();
    

    Prozess wieder freigeben sonst bleibt so hängend



  • Problem ist wenn ich das Object schliessen möchte "CloseConnection" und genau gesagt beim:

    d.h. du hast doch mehr Informationen zu deinem Absturz?

    Ich denke du hast irgendwelche Synchronisationsprobleme mit deinen Threads

    m_MtxProcess.lock(); 
    m_WaitCondProcess.wait(&m_MtxProcess,-1); 
    m_MtxProcess.unlock();
    

    Der Code sieht komisch aus - ist dir 101% klar was du da machst? bist du Fit mit Threads?

    Bei Threadproblemen ist es ABSOLUT vorbei mit Ausprobieren-bis-es-läuft
    sonst kommst du genau in die Probleme rein die du gerade hast



  • Gast3 schrieb:

    Problem ist wenn ich das Object schliessen möchte "CloseConnection" und genau gesagt beim:

    d.h. du hast doch mehr Informationen zu deinem Absturz?

    Ich denke du hast irgendwelche Synchronisationsprobleme mit deinen Threads

    m_MtxProcess.lock(); 
    m_WaitCondProcess.wait(&m_MtxProcess,-1); 
    m_MtxProcess.unlock();
    

    Ich glaube eher nicht, da ich eigentlich auf die Sunchronisation genau geachtet habe sonst hätte auch die Relase Version, was nicht der Fall ist.
    Unter Visual Studio 2008 habe ich das Problem nicht.

    Gast3 schrieb:

    Der Code sieht komisch aus - ist dir 101% klar was du da machst?

    zu 99.9 ja

    Gast3 schrieb:

    bist du Fit mit Threads?

    Geht so

    Gast3 schrieb:

    Bei Threadproblemen ist es ABSOLUT vorbei mit Ausprobieren-bis-es-läuft
    sonst kommst du genau in die Probleme rein die du gerade hast

    Warum erst jetzt und nur in Debug Version und nur unter VStudio 2015?



  • sonst hätte auch die Relase Version, was nicht der Fall ist.

    Unter Visual Studio 2008 habe ich das Problem nicht.

    Warum erst jetzt und nur in Debug Version und nur unter VStudio 2015?

    Weil UB ein Biest ist und genau solche Effekte zeigt - und viele Entwickler einfach jahrelang schlechten Code schreiben der leider doch gut genug funktioniert und sich dabei ein falsches Selbstvertrauen aufbaut - bis man dann mal wirklich auf solche Probleme stößt - falls es sowas ist, und du es findest ist das ein ziemlicher Aha-Effekt

    Debug und Release haben anderes Zeitverhalten, der VS2008 Kompiler generiert ganz anderen Code

    wenns unter Linux kompiliert würde ich SOFORT den UB-Sanitizer, Thread-Sanitizer und den Address-Sanitizer nutzen - sind per Parameter beim Kompiler aktivierbar das sind zur Zeit die besten Tools die es gibt - da kommt nichts ran

    unter Windows könntest du die Trial-Version vom Intel-Inspector (https://software.intel.com/en-us/intel-inspector-xe) drauflassen
    vielleicht sieht du da etwas - es kann aber sein das du Problem-Meldungen bekommst die nicht wirklich Fehler sind - das ist bei den Linux-Tools so gut wie nicht der Fall



  • @ Danke

    was ich erst mal sicher bin, dass das Problem genau in diese

    class VisaAgilent
    

    ist.

    Das zu finden ist .....



  • deswegen die genannten Tools - die Linux-Varianten sind unschlagbar, der Intel Inspector wohl am einfachsten ausprobierbar - Install und im VStudio einen Knopf drücken



  • Stelle sicher, dass der Thread sich selbst beendet und du ihn nicht dazu zwingst. Auch sind diese Ganzen Konstrukte um new/delete, lock/unlock, strcmp, typedef enum/struct, NULL etc. nicht zu empfehlen oder veraltet, benutz' doch std::string, std::unique_ptr, std::async, std::lock_guard etc. Damit schließt du schonmal unbeabsichtigte Fehler aus.



  • m_MtxProcess.lock();
    m_WaitCondProcess.wait(&m_MtxProcess,-1);
    m_MtxProcess.unlock();
    

    Auf was wartest du denn hier? Ich gehe mal davon aus, dass m_WaitCondProcess vom Typ QWaitCondition ist.

    Wo rufst du das dazu gehörende wakeOne() oder wakeAll() auf?
    Den zweiten Parameter kannst du dir da sparen. Die Doku sagt, dass es sich um ein unsigned long handelt. -1 dürfte dann ULONG_MAX sein, was laut Doku nie in einem Timeout landet und default verhalten ist...



  • Schlangenmensch schrieb:

    m_MtxProcess.lock();
    m_WaitCondProcess.wait(&m_MtxProcess,-1);
    m_MtxProcess.unlock();
    

    Auf was wartest du denn hier? Ich gehe mal davon aus, dass m_WaitCondProcess vom Typ QWaitCondition ist.

    Ich warte bis der thread "run" fertig ist
    ja ist sie auch.

    Schlangenmensch schrieb:

    Wo rufst du das dazu gehörende wakeOne() oder wakeAll() auf?
    Sorry das habe ich vergessen miteinzufügen:

    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;
        }
        .....
    	QThread::msleep(m_iResponseDelayed);
    
    	QMutexLocker locker(&m_MtxProcess);
    
    	m_WaitCondProcess.wakeOne();
        }
    

Anmelden zum Antworten