ASSERT in Release abfangen / FAQ?



  • Moin!

    Man kann folgendermaßen den ASSERT abfangen (in Release) und eine eigene Funktion dafür ersetzen:

    #ifndef _DEBUG
    #undef ASSERT
    #define ASSERT(f) \
    	\
    	if (!(f)) \
    		CMFCTestDlg::DumpAssert(__FILE__, __LINE__, "Fehler.log", #f); \
    #endif
    

    Funktion DumpAssert() erstellen:

    void CMFCTestDlg::DumpAssert(LPCSTR lpszFileName, int nLine, LPCTSTR szDumpFilename, const char* sz)
    {
      CFile cFile;
      CString strText, strDatum;
      CTime t, current;
    
      // Datum und Uhrzeit holen
      current = t.GetCurrentTime();
      strDatum.Format(_T("%02d.%02d.%4d %02d:%02d:%02d")
    	  , current.GetDay()
    	  , current.GetMonth()
    	  , current.GetYear()
    	  , current.GetHour()
    	  , current.GetMinute()
    	  , current.GetSecond()); 
    
      // Log-Datei öffnen / erstellen
      cFile.Open(szDumpFilename, CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite);
    
      // Text formatieren, der in die Log-Datei geschrieben werden soll
      strText.Format("- Assertion fehlgeschlagen!\r\n    Datum : %s\r\n    Datei : %s\r\n    Zeile : %d\r\n    Fehler: %s\r\n\r\n"
    	  , strDatum
    	  , lpszFileName
    	  , nLine
    	  , sz);
    
      // Ans Ende der Datei springen, Text schreiben und Datei schließen
      cFile.SeekToEnd();
      cFile.Write(strText, strText.GetLength());
      cFile.Close();
    }
    

    In meiner Funktion werden die Informationen in eine Textdatei geschrieben.

    Gruß, Manuel. 🙂



  • darf man fragem was es mit dem while(false) auf sich hat?



  • Ich denke mal damit wird ein ; nach dem Makro erzwungen.

    Für ein ASSERT das sowohl in Debug und Release funktioniert nicht, nimmt man VERIFY



  • Das mit dem VERIFY könnte auch falsch sein, sorry. 🤡



  • Ein VERIFY hat in der Release Version, soweit ich weiß, die selbe Funktion wie das ASSERT in der Debug Version.

    Mir ging es aber darum, das Assert in der Release Version abzufangen. Man könnte beispielsweise das Programm "sauber" beenden lassen, wenn ein ASSERT fehlschlägt. Oder eine eigene MessageBox aneigen lassen, in der nur die gewünschten Informationen zu sehen sind. Und, und, und...

    Ich hoffe ich habe mich verständlich ausgedrückt. *g*

    @CMatt: Ohne do ... while läuft es auch. Ich hatte nur ein bisschen experimentiert... 🤡



  • VERIFY nimmt man für Sachen, die etwas tun, ASSERT für Bedingungen.

    Denn, in der Releaseversion sieht ein

    ASSERT(x == 0);
    

    so aus

    Ein

    VERIFY(x = 0);
    

    wird zu

    x = 0;
    

    Sowas ist übrigens eine beliebte Fehlerquelle... ⚠


Anmelden zum Antworten