Was bedeutet dieser Debugerfehler



  • Ich hab ein Problem (obwohl ich weiß noch nicht, ob es wirklich eines ist). Beim Ausführen meines Programms öffnet sich eine Message Box, die einen Debugerfehler angezeigt: "Debug Assertion failed". Klicke ich nun auf den Button ignorieren, macht das Programm trotzdem das, was es soll. Nun frage ich mich aber trotzdem, ob ich die die Fehlermeldung beachten sollte um mir spätere Probleme zu ersparen.

    Das Programm wartet in der Methode "acceptConnection" der Klasse "Server" mit einem blockierenden Accept auf eine eingehende Socket-Verbindung. Ist die Verbindung erfolgt, wird die Thread-Funktion "clientServerThread" gestartet, wobei als Parameter ein Zeiger auf ein Array von Objekten der von mir erstellten Klasse "ClientConnection" übergeben wird.
    [cpp]
    BOOL Server::acceptConnection(UINT slotNr)
    {
    if(serverSock.Accept(clientConnections[slotNr].getInBufSocketSocket()))
    {
    // 2.Parameter: Zeiger auf Array von Objekten
    AfxBeginThread(clientServerThread, (LPVOID) clientConnections);
    return TRUE;
    }
    else
    return FALSE;
    }

    // Threadfunction for Client-Server Connection; processing of incoming Messages
    UINT clientServerThread(LPVOID pParam)
    {
    ClientConnection * cc = static_cast<ClientConnection*>(pParam);

    // Zeiger auf erstes Objekt des Arrays
    ClientConnection * test = &cc[0];
    Message m;
    CString bla;

    // ----->Hier tritt der Debug Fehler auf------->
    // im Wesentlichen wird dabei die Methode unten aufgerufen...
    // also bitte erstmal weiterlesen

    cc->fetchNextMessage();

    // Speichert Nachricht in ein Objekt des Typs "Messsage"
    m = *cc->getMessage();
    bla = *m.getSender(); // Sender der Nachricht wird in CString gespeichert

    // Trotz Debug Fehler wird hier die Nachricht korrekt ausgegeben
    std::cout << bla.GetBuffer(0) << "\n";

    return 0;
    }[/cpp]

    Die Klasse "ClientConnection" enthält unter anderem ein Objekt des Typs InBufSocket das im Wesentlichen aus einem Konstrukt aus einem CSocket, einem CArchive und einem CSocketFile besteht, das als Eingangspuffer für eingehende Nachrichten dient (das Konstrukt aus diesen 3 Objekten wird im MSDN beschrieben und funktioniert auch).
    Die Methode fetchNextMessage(), bei der oben der Fehler auftritt ruft im Prinzip nur die Methode :

    BOOL InBufSocket::acceptMessage(Message * m) {
    	BYTE tempB;
    	WORD tempW;
    	CString tempCS;
    
          // Copy received date into 'Message' object
    	try 
    	{
             // --> buf ist der Zeiger auf das CArchive Objekt
             // Hier tritt der Fehler auf:
    		buf->operator >> (tempB);
    		m->setMsgType(tempB);
    
                //.......	
          }
    	catch (...) {
    		return FALSE;
    	}
    
    	return TRUE;
    }
    

    auf. Dazu ist vielleicht noch zu sagen, das diese Methode (und natürlich die zugehörige Klasse) in einer DLL vorhanden wird, die vom Hauptprogramm oben aufgerufen wird.

    Ich hoffe das was ich geschrieben habe kann jemand nachvollziehen. Mich interessiert ja eigentlich nur, was dieses "Debug assertion failed" bedeutet, ob man es ignorieren kann und was man evtl. dagegen tun kann.



  • Dieses MessageBox bedeutet das etwas eingetreten ist was nicht eintreten soll.

    z.B.

    int x = 3;
    ASSERT(x == 3); // x muss 3 sein sonst wäre das echt voll super doof - echt ;)
    

    Wurde das Programm im Debugmodus kompiliert und x ist nicht 3 so kommt eine MessageBox die einem mitteilt das die Behauptung nicht stimmt. Drückt man auf Wiederholung und das Studio schmiert einem vorher nicht ab so landet man in der Zeile wo das ASSERT steht. Vorteil von ASSERT ist das es im Release Modus keinen zusätzlichen Code produziert.



  • wenn du dir arbeit beim debuggen sparen willst solltest du immer ein assert auf zustände legen die nie auftreten dürfen
    z.b.

    long array[15];
    
    long GetVal(int Index)
    {
      assert(Index>=0 && Index<15);
      return array[Index];
    }
    

Anmelden zum Antworten