Debuggen



  • Hallo,

    beim kompilieren meiner Anwendung, erscheint ein Ausgabefenster innerhalb von VS2005Pro. Ist es möglich, dort bestimmte Werte sich ausgeben zu lassen? Sowas wie printf oder cout, oder in einer Konsole? Ich möchte bestimme Werte während der Programmausführung überwachen. Ständig mit AfxMessageBox(); zu arbeiten, geht echt auf Dauer ziemlich auf die Nerven, dass geht doch bestimmt komfortabeler?

    Grüße
    ToH


  • Administrator

    Wenn du am entsprechenden Punkt anhälst und mit der Maus über die Variable gehst, wird dir normalerweise den aktuellen Wert als Tooltip angezeigt. Oder du fügst eine Überwachung hinzu, bzw. über rechtsklick auf die Variable kannst du so ein Quickwatch oder sowas aufrufen.
    Und ansonsten such nach einem Command Window. Ist bei mir in 2003 unter View -> Other Windows
    Dort kannst du im Immediate modus einfach die Variable eingeben und Enter drücken. Dann erscheint auf einer neuen Zeile der Wert.

    m_nWert
    5
    

    Du kannst auch Werte ändern, halten allerdings nur grad während dem einen Ablauf.

    m_nWert = 1
    

    Mit dem kannst du übrigens auch auf die privaten Member, bzw. einfach auf jeden Wert zugreifen und für kurze Zeit schnell ändern.

    Aja und es gibt dann auch noch eine AddWatch Funktion. So kannst du eine Variable ständig überprüfen.
    Zudem sollte es noch die Fenster Local und Autos geben, welche dir auch Werte anzeigen können. ^^

    Hoffe das hilft dir.

    Grüssli



  • toh schrieb:

    beim kompilieren meiner Anwendung, erscheint ein Ausgabefenster innerhalb von VS2005Pro. Ist es möglich, dort bestimmte Werte sich ausgeben zu lassen? Sowas wie printf oder cout, oder in einer Konsole? Ich möchte bestimme Werte während der Programmausführung überwachen. Ständig mit AfxMessageBox(); zu arbeiten, geht echt auf Dauer ziemlich auf die Nerven, dass geht doch bestimmt komfortabeler?

    Was du suchst ist das Makro TRACE(). Funktioniert mit dem selben Syntax wie printf. Beispiel:

    int a = 5;
    TRACE("Wert von a: %i \n",a);
    

    Schau einfach in der MSDN mal nach TRACE. 😉

    Gruß Brainiac

    PS: Wieso wird TRACE eigentlich so selten hier im Forum empfohlen/benutzt??? Ist es irgendwie verpönt?



  • Mit TRACE kann man die gleiche Formatierungstechnik anwenden wie mit printf(...). Beispiel InitInstance wie folgt:

    BOOL CMyApplication :: InitInstance() 
    { 
    	TRACE("CMyWindow soll nun auf dem Heap erstellt werden.\n");
    	TRACE("m_pMainWnd: %X\n", m_pMainWnd);
    	m_pMainWnd = new CMyWindow;
    	TRACE("CMyWindow wurde auf dem Heap erstellt.\n");
    	TRACE("m_pMainWnd: %X\n", m_pMainWnd);
    	m_pMainWnd ->ShowWindow( m_nCmdShow ); 
    	TRACE("ShowWindow(...) wurde ausgeführt.\n");
    	return TRUE; 
    }
    

    Nun erhält man folgende Ausgabe:

    CMyWindow soll nun auf dem Heap erstellt werden.
    m_pMainWnd: 0
    Konstruktor von CMyWindow wurde ausgeführt.
    CMyWindow wurde auf dem Heap erstellt.
    m_pMainWnd: 301B00
    ShowWindow(...) wurde ausgeführt.
    

    Man kann mit TRACE(...) bestens die Werte von Variablen verfolgen. In der Releaseversion werden die TRACE-Anweisungen anschließend einfach übergangen.

    Neben TRACE gibt es noch die speziellen Makros TRACE0, TRACE1, TRACE2 und TRACE3:

    TRACE0( format-string )
    TRACE1( format-string, var1 )
    TRACE2( format-string, var1, var2 )
    TRACE3( format-string, var1, var2, var3 )
    

    Beim Einsatz von Unicode sind die Makros TRACE0, TRACE1, TRACE2 und TRACE3 einfacher zu verwenden als TRACE, da in diesem Fall _T(...) nicht notwendig ist. Man könnte InitInstance(...) demnach auch wie folgt schreiben:

    BOOL CMyApplication :: InitInstance() 
    { 
    	TRACE0("CMyWindow soll nun auf dem Heap erstellt werden.\n");
    	TRACE1("m_pMainWnd: %X\n", m_pMainWnd);
    	m_pMainWnd = new CMyWindow;
    	TRACE0("CMyWindow wurde auf dem Heap erstellt.\n");
    	TRACE1("m_pMainWnd: %X\n", m_pMainWnd);
    	m_pMainWnd ->ShowWindow( m_nCmdShow ); 
    	TRACE0("ShowWindow(...) wurde ausgeführt.\n");
    	return TRUE; 
    }
    

    Probiert z.B. auch diesen Code aus:

    //...
    m_pMainWnd = new CMyWindow;
    TRACE2("Style: %d, ExStyle: %d \n", m_pMainWnd->GetStyle(), 
                                        m_pMainWnd->GetExStyle() );
    //...
    

    Man erhält damit:

    ...
    Style: 80674816, ExStyle: 768
    ...
    


  • Wieso wird TRACE eigentlich so selten hier im Forum empfohlen/benutzt??? Ist es irgendwie verpönt?

    Das Debuggen wird in den meisten Büchern nicht von Anfang an gezeigt, sondern - wenn überhaupt - irgendwo im Anhang abgehandelt.
    Dennoch ASSERT, ASSERT_VALID, ASSERT_KINDOF und TRACE, TRACE0, TRACE1, TRACE2 und TRACE3 sowie Haltepunkte sind wichtige Hilfsmittel beim Aufspüren von Fehlern und Problemen. Man sollte das öfter empfehlen.



  • Wow Erhard, das war ne ausführliche Erklärung. 👍 🙂
    Wer mehr zum Debuggen wissen will, der kann auch da gucken: http://www.c-plusplus.net/forum/viewtopic-var-t-is-120832.html
    Leider weiß ich nicht, wie weit es sich auf VC2005 übertragen lässt, aber bei VC2003 passte alles, was ich gesucht habe recht gut.



  • Wow Erhard, das war ne ausführliche Erklärung. 👍 🙂

    Lob vom Moderator, das ist selten, tut aber gut. 🙂


Anmelden zum Antworten