Debug Funktion schreiben - als statische klasse?



  • ich moechte eine debug klasse schreiben, die es mir bequm erlaubt in allen programmteilen eingesetzt zu werden und die eigentliche meldung dann je nach dem was die debug klasse definiert, ausgibt.

    die meldung selbst will ich mit
    asprintf (&stringResult,"INFO: hier kommt di emeldung i hat: %i", werti)
    formatieren und der debugklasse uebergeben.

    also so:
    asprintf (&DebugC,"INFO: hier kommt die meldung: zaehler hat: %i", zaehler)

    wenn ich z.b. DebugC den wert 1 angebe, moechte ich alles sehen, bei wert 2 soll zusaetzlich ein logfile geschrieben werden etc.
    also die aktion was wie ausgegeben wert, will ich global einstellen.
    und da ich debug ueberall benutzen will (jedoch ohne threads) dachte ichdaran sie static zu machen.

    aber es geht so nicht. weiss jemand rat?

    p.s ein makro kommt nicht infrage, da ich zur laufzeit einfluss nehmen moechte.

    class DebugC
    {
    private:
    static std::string s_messageString;
    static int debuglevel;

    public:
    static std::string& operator=(const std::string& s);
    static int& operator=(const int& i);

    };



  • Belgarad schrieb:

    class DebugC
    {
    private:
    static std::string s_messageString;
    static int debuglevel;

    public:
    static std::string& operator=(const std::string& s);
    static int& operator=(const int& i);

    };

    Da mir nahezu überhaupt nicht klar ist, was du genau willst und wo genau der Schuh drückt, kann ich dir nicht mehr sagen, als dass der op= niemals eine statische Methode sein kann. Würde ja auch keinen Sinn machen. Der Op= ist für Zuweisungen zwischen *Objekten* zuständig. static heißt hier aber gerade Klassenmethode, also *keine Objekte*.



  • ich moechte die klasse DebugC wie folgt verwenden:
    asprintf (&DebugC,"INFO: hier kommt die meldung: zaehler hat: %i", zaehler);
    asprintf (&DebugC,"DEBUG: ungueltiger wert von variable xyz: %i", xyz);
    asprintf (&DebugC,"DEBUG: function abc noch nicht implementiert");
    asprintf...
    d.h. ihr werte zuweisen, als wenn es ein string waere.

    dann moechte ich in abhaengigkeit vom dem wert debuglevel innerhalb von DebugC eine aktion ausfuehren, die innerhalb von DebugC als methode definiert ist.

    warum:
    ich moechte DebugC innerhalb aller programmteile verwenden, um Debug Meldungen ausgeben zu koennen. diese meldungen sollen dann wahlweise
    -in eine datei geschrieben
    -oder per cout ausgegeben werden
    -oder beides.
    -oder ...
    wie genau, das soll ueber die "debuglevel" innerhalb von "DebugC" gesteuert werden.

    da dies fuer alle programmteile gehen soll und immer nur eine meldung zeitgleich verarbeitet werden muss, dachte ich daran die klasse statisch zu machen.

    mein problem ist:
    wie kann sieht das Interface von "DebugC" aus, damit ich es in asprintf() verwenden kann.
    ich dachte, dazu muesste in den op= verwenden.



  • Muss man asprintf kennen? Ist das C99? Edit: Oh, so eine komische GNU-Erweiterung. Naja, sieht jedenfalls nicht sehr hilfreich aus, kannst du höchstens in der Implementierung von output verwenden 🙂

    Ich glaube, am ehesten passt bei dir eine statische Methode, die die Parameter per varargs an *printf weitergibt und dann damit irgendwas Tolles macht. Also in etwa:

    class DebugC
    {
    private:
        /* Variablen, die das Verhalten steuern */
    public:
        static void output(...);
        /* Funktionen, über die man das Verhalten ändern kann */
    };
    


  • Wobei eine Klasse irgendwie hier überhaupt keinen Sinn macht...



  • scheint doch ein schwierigeres unterfangen zu werden. moeglicherweise ist mein ansatz das per klasse zu machen nicht sooo sinnvoll.

    wie macht ihr das denn wen ihr steuern wollt wo welche debug/error/info meldungen erscheinen sollen?



  • Da würde ich doch glatt #define nehmen. Debugging ist imho ein Thema, wo man schon mal etwas schummeln darf 🙂

    Edit: Ach halt, du wolltest es ja zur Laufzeit ändern. Naja, dann deine Funktion plus die zusätzlichen Einstellungsfunktionen in eine .h und die Implementierung samt globalen Variablen (in einem anonymen Namespace) in die .cpp. Globale Variablen sind evil, aber ... es geht ja um Debugging 😉



  • Wie wärs denn mit Anwendungen a la:

    Debug("Die Variable i hat den Wert ", i);
    

    Die Klasse Debug müßte dazu nur eine kluge Auswahl an Konstruktoren haben. Gleichzeitig hätte sie ein paar static-Elemente, wie das Debug-Level, Streams usw. Der Konsruktor schreibt seine Argumente (vom Debug-Levelgesteuert) irgendwo hin und fertig.
    Oder sehe ich das jetzt zu einfach (ist ja schon spät)?

    So, und nachdem ich jetzt konstruktiv war: Was soll das? Genügt denn dein Debugger nicht?

    Stefan.


Anmelden zum Antworten