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
-
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 derstart()
Aufruf kracht die SW, da die
run()
Methode nicht aufgerufen wird was normaleweise nicht der Fall ist.
alsorun()
muss immer automatische nach dem Aufruf von
start()
folgen.
-
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 -
@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.
-
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.