Debuggen mit der autoexp.dat

Die autoexp.dat beschreibt eigene Datentypen für Visual Studio für den Debugger und erlaubt die Beschreibung der Tooltipps beim Debuggen.

Die Datei selbst befindet sich - je nach installierter Visual Studio Version - in $(VSInstallDir)\Common7\Packages\Debugger, bzw. unter Visual Studio 6 unter $(VS6InstallDir)\Common\MSDev98\Bin.

Bei sind es die Pfade C:\Programme\DevStudio\Common\MSDev98\Bin für VC6 und C:\Programme\Microsoft Visual Studio 8\Common7\Packages\Debugger für Visual Studio 2005.

Ich erstelle nun ein Projekt mit folgender Quelltext und setze einen Breakpoint auf std::cout « l in der main-Funktion:

#include <iostream>
 
class Point
{
    friend std::ostream & operator <<( std::ostream &, Point const & );
private:
    int _very, _important, _data;
    int _x, _y;
 
public:
 
    Point( int x, int y ) : _x( x ), _y( y ) {}
 
    void move( int x, int y ) { _x += x; _y += y; }
};
 
class Line
{
private:
    friend std::ostream & operator <<( std::ostream &, Line const & );
    Point _source, _target;
public:
 
    Line( Point const & src, Point const & trgt ) : _source( src ), _target( trgt ) {};
};
 
 
std::ostream & operator << ( std::ostream & os, Point const & rhs )
{
    os << "Point(" << rhs._x << "/" << rhs._y << ")";
 
    return os;
}
 
std::ostream & operator << ( std::ostream & os, Line const & rhs )
{
    os << "Line(" << rhs._source << " -> " << rhs._target << ")";
 
    return os;
}
 
int main()
{
    Point p(1,2);
    p.move( 1, 5 );
    Line l( p, Point( 47, 11 ));
    std::cout << l;                // <--- BreakPoint
}

Es liefert folgende Ausgabe:

Line(Point(2/7) -> Point(47/11))

Möchte ich nun die Schritte nachvollziehen, so kann ich die Maus über das p halten und sehe folgendes:

Mich interessiert an dieser Stelle vorrangig die Position des Punktes, diese wird jedoch verdeckt durch andere Variablen, die mich derzeit weniger interessieren.

Hierauf lässt sich mit der Datei autoexp.dat Einfluss nehmen, in dem ich dem Debugger erkläre, wie er einen Datentyp Point zu beschreiben hat. Hierzu füge ich folgende Zeile in die Datei autoexp.dat ein.

Point = Point( <_x>, <_y> )

Zunächst wird der Datentyp benannt und dem Datentyp anschließend ein Text zugewiesen, in diesem Fall 'Point( <_x>, <_y> )'. Ausdrücke, die in < und > stehen, werden dabei innerhalb der Klasse ausgewertet. In diesem Fall werden also die Werte _x und _y eingefügt:

Diese Ausdrücke werden jedoch nicht zwangsweise übernommen, wie der Blick auf die Variable l vom Typ Line zeigt:

Auch hier erweitern wir die autoexp.dat um eine Zeile für diesen Datentyp. Es dürfen nämlich auch die Punkt('.') und Pfeiloperatoren ('→') verwendet werden:

Line = Line( (<_source._x>, <_source._y>) -> (<_target._x>, <_target._y>) )

Und hier haben wir das Ergebnis:

Die Beschreibungen des Points werden jedoch beim Aufklappen durchaus berücksichtigt, wie folgende Ausgabe zeigt:

In der autoexp.dat finden sich Anleitungen für weitere Konfigurationsmöglichkeiten, zum Beispiel lässt sich der Datentyp angeben, wie der Datentyp ausgegeben wird (z.B. char * als Pointer (hexadezimale Zahl) <_text,x> oder String <_text,s>).