wspiess: C/C++ Debugging in VC

Hallo Leo,
zu deiner gestrigen EMAIL. Über einige Deiner Fragen bezüglich der VC-IDE
muss ich erst nocheinmal "brüten.
Erstmal zur letzten question

führst du das debugging duch ? ich habe in beispielen immer wieder TRACE, VERIFY und ASSERT »»gelesen. wie werden diese befehle verwendet?

Diese Befehle sind Makros die in der VC IDE abgearbeitet werden.
1.) ASSERT()
Dieses Makro hat die Form ASSERT(argument);.
Das Argument argument wird auf FALSE(=0) oder TRUE (größer NULL)
geprüft. Ein Beispiel  z.B.:

int \* pZahl;  
pZahl=new int;      // liefert NULL, wenn kein Speicher vom Typ Heap zur Verfügung steht  
ASSERT(pZahl);  //  
...  

Ergibt die Überprüfung des Arguments argument FALSE, zeigt das Laufzeitsystem eine Box mit
dem Text "Assertation failed....". Nach der Benutzerbestätigung wird das Programm abgebrochen.
Diese Makro arbeitet nur in der Debug-Version..

2.) Verify()
Um auch in der Releaseversion ein argument in der Art und Weise wie  ASSERT() auszuwerten muss das Makro VERIFY() benutzt werden.

Trace()
Mittels dieses Makros können zur Laufzeit eines Programmes Textausgaben in das Debugfenster
des IDE gemacht werden.Das Makro wird allerdings nur ausgegührt, wenn dass Programm im Debug-Modus ausgeführt wird(siehe oben). Die engültige Programmversion, auch Releaseversion genannt, führt das Makro nicht mehr aus.
Die Funktion ist der printf() Funktion aus der Programmiersprache C angeglichen.
TRACE("ausgabetext %d",wert);
Man nutzt das Makro um die Programmabfolge eines Windowsprogrammes überprüfen zu können.
gruss wolfgang

  1. Hi Wolfgang,

    das ist zwar eigentlich kein Forum für C/C++-Entwickler, aber da muss ich einschreiten:

    2.) Verify()
    Um auch in der Releaseversion ein argument in der Art und Weise wie  ASSERT() auszuwerten muss das Makro VERIFY() benutzt werden.

    Das ist falsch. VERIFY() ist im Gegensatz zu ASSERT() zwar auch in einem Release-Build definiert, aber wertet den Ausdruck dann nicht aus. Der Unterschied ist dabei, dass das ASSERT()-Makro in Release samt Argument entfernt wird, das Argument von VERIFY() wird aber ausgeführt.

    Wenn man eine Funktion hat, die eine Fehlernummer zurückbringt, kann man den Fehler mit den Funktionen überprüfen und eine Warnung erhalten.

    Kleines Beispiel:

    ASSERT( LineTo( hDC, x, y ) );

    Diese Zeile wird nur in einem Debug-Build ausgeführt, im Release wird die Linie nicht gezogen.

    VERIFY( LineTo( hDC, x, y ) );

    Hier wird die Linie auch im Release-Build gezogen, nur gibt es keine Warnung mehr bei einem etwaigen Fehler. (Kann da was schiefgehen? Ja. Win95/98 haben ein Koordinatensystem von -32767 bis +32767, NT ein bißchen mehr)

    Gruß,
    Martin

    1. Hi Martin,
      mei is es heut' heiss, mich muss mal kuehlwasser ausgiessen
      bevor hier glaubenskriege ausbrechen. ich brauche c, um meine scriptdatenbank zu erzeugen.
      ich hatte eine mail gesendet, ....denn ich nutzte das MAKRO ASSERT. als argument hatte ich
      eine funktion untergebracht, die ein item allokiert. mir war nicht klar, dass in der releaseversion das
      ASSERT MAKRO quasi auskommentiert wird. irgendwie funktionierte das menu  nicht mehr so wie
      es sollte. das VERIFY MAKRO war mir neu.

      jetzt funktioniert mein programm jedenfalls so wie ich es wollte. das VERIFY MAKRO wird in der
      release zwar ausgewertet, aber das programm wird nicht unterbrochen. it works.

      was meinst du mit

      das ist falsch. VERIFY() ist im Gegensatz zu ASSERT() zwar auch in einem Release-Build definiert, aber
      wertet den Ausdruck dann nicht aus. Der Unterschied ist dabei, dass das ASSERT()-Makro in Release samt
      Argument entfernt wird, das Argument von VERIFY() wird aber ausgeführt.

      ??????
      *g* leo

      1. Hi Leo,

        was meinst du mit

        das ist falsch. VERIFY() ist im Gegensatz zu ASSERT() zwar auch in einem Release-Build definiert, aber
        wertet den Ausdruck dann nicht aus. Der Unterschied ist dabei, dass das ASSERT()-Makro in Release samt
        Argument entfernt wird, das Argument von VERIFY() wird aber ausgeführt.

        das war unglücklich ausgedrückt. Ich kopier mal den entsprechenden Absatz aus der MSDN rein:

        "The expression argument to ASSERT will not be evaluated in the release version of your program. If you want the expression to be evaluated in both debug and release versions, use the VERIFY macro instead of ASSERT. In debug versions, VERIFY is the same as ASSERT. In release versions, VERIFY evaluates the expression argument but does not check the result."

        Was ich meinte war, daß das Ergebnis des Arguments von VERIFY in einem Release-Build nicht ausgewertet wird, d.h. im Fall dass der Ausdruck FALSE ergibt keine Warnung erzeugt wird.

        Es gibt übrigens noch mehr solche Makros, z.B. _ASSERTE (der Ausdruck, der den DebugBreak ausgelöst hat, wird mit angezeigt), ASSERT_VALID (MFC-Makro, prüft von CObject abgeleitete Klassen in dem es deren AssertValid Methode aufruft), ASSERT_KINDOF, usw.

        Gib' einfach mal im Index der MSDN "assert" (ohne Anführungszeichen) ein, da kommt eine ganze Liste.

        Gruß,
        Martin