Funktionen zum Debuggen
-
Servus,
ich las, es gibt in C++ keine ähnlichen Funktionen wie var_dump() in php oder toString() in Java? Wie macht ihr es dann, wenn ihr euch die Inhalte einer Variablen anzeigen lassen wollt?
-
Wir benutzen einen Debugger.
-
... oder man nutzt die streams (und die passenden operator<<() & operator>>()).
Die können in C++ nämlich nicht nur mit strings umgehen, sondern prinzipiell mit allem.string s = "mein String"; int i = 2; double d = 3.4; char c = 'c'; myClass m ('f', d, 17); // auf die Konsole cout << s << i << d << c << m; // in ein File ofstream logFile("myPG.log"); logfile << s << i << d << c << m; // in einen string ostringstream ost; ost << s << i << d << c << m; mach_was_mit_einem_string(ost.str());
Gruß,
Simon2.
P.S.: OK für myClass muss man noch einen operator<<() selbst schreiben, aber das ist generisch und nahezu trivial - und auch nicht anders als javas toString() .
-
Jay1980 schrieb:
Servus,
ich las, es gibt in C++ keine ähnlichen Funktionen wie var_dump() in php oder toString() in Java? Wie macht ihr es dann, wenn ihr euch die Inhalte einer Variablen anzeigen lassen wollt?
Wie schon mein Vorgänger geschrieben hat, benutzt man am besten einen Debugger. Das geht aber nicht immer. Dafür habe ich mir eine kleine Funktionsbibliothek geschrieben, mit der ich die Inhalte bestimmter Variablen in eine Log-Datei ausgeben kann. In die Logdatei schreibe ich dann auch noch Quelltextname uns Zeilennummer. Das ganze is so implementiert, daß es natürlich nur dann greift, wenn das Makro NDEBUG nicht gesetzt ist.
Das sieht dann beispielsweiose so aus:
doEnterFunction("MIDIdrumWindow::stopPlayMidi"); ... doLogValue( "%d", i ); .... doShowLog();Der dazugehörige Header sieht so aus:
#if !defined( NDEBUG ) || defined( _DEBUG ) void logValue( const char *fName, int lineNum, const char *var, const char *format, ... ); void startLog( const char *file, int line, const char *function ); void showLog( const char *file, int line ); void enableLog( void ); void disableLog( void ); #define doLogValue( fmt, val ) logValue( __FILE__, __LINE__, #val, fmt, val ) #define doLogPosition() logValue( __FILE__, __LINE__, "", "", "" ) #define doStartLog() startLog( __FILE__, __LINE__, "" ) #define doEnterFunction( x ) startLog( __FILE__, __LINE__, x ) #define doShowLog() showLog( __FILE__, __LINE__ ) #define doEnableLog() enableLog() #define doDisableLog() disableLog() #else #define doLogValue( fmt, val ) /* nothing */ #define doLogPosition() /* nothing */ #define doStartLog() /* nothing */ #define doEnterFunction( x ) /* nothing */ #define doShowLog() /* nothing */ #define doEnableLog() /* nothing */ #define doDisableLog() /* nothing */ #endifmfg Martin
-
Oder man nutzt Makros:
#ifdef DEBUG #define DEBUG_OUT(x) std::cout << #x##"=" << x << std::endl; #else #define DEBUG_OUT(x) ; #endif //... int x = 5; DEBUG_OUT(x)kann sein das ich mich mit dem ## vertue, sonst halt <<.

-
Oder wir führen nach 'Alt Väter Sitte' zum Testen eine Protokolldatei mit. Hierin trägt man wichtige Schritte und Variable des Programmablaufes ein und kann sich die in Ruhe in einer Datei ansehen. Was nicht mehr gebraucht wird, wird auskommentiert und kann bei Bedarf (Wartung) jederzeit reaktiviert werden.
-
Das ist aber auch kein "C++-Spezifikum", sondern müsste man in Java doch auch so machen, oder?
Gruß,
Simon2.
-
Simon2 schrieb:
Das ist aber auch kein "C++-Spezifikum", sondern müsste man in Java doch auch so machen, oder?
Klar, das ist kein 'C++-Spezifikum', weil man das überall effizient machen kann. Gehört jetzt aber in die Rubrik Programmierstil oder wäre eine der möglichen Antworten auf die Frage 'Wie mache ich mir das Leben als Programmierer möglichst einfach und vermeide verdeckte Fehler?' :p
C++-spezifisch ist jedoch, dafür wie vorgeschlagen streams einzusetzen - egal ob für Bildschirm oder Datei. Man spart sich dann das Nachdenken über Datentypen.
Der Fragesteller hat nach 'Funktionen zum Debuggen' gefragt. So etwas gibt es in C und C++ nicht und braucht es nicht zu geben. Man schmeisst einen Debugger an oder verwendet einen der anderen Vorschläge.
-
berniebutt schrieb:
...
Der Fragesteller hat nach 'Funktionen zum Debuggen' gefragt. ...Ich hatte die Frage anders verstanden. "Wie kann ich in C++ das machen, was ich in Java <so-und-so> mache?"
Ist aber auch egal - ich denke, für den Fragesteller ist eine Menge herausgekommen, was ihm weiterhilft.Gruß,
Simon2.