Practical Debugging in C++ Tue, Jul 3. 2007


Ein verlockender Titel und Schmetterlinge am Cover - was will man mehr? Idealerweise den dazu passenden interessanten Inhalt - und genau hier hakt es bei diesem 104 Seiten umfassenden Heftchen leider deutlich.
Aus dem Vorwort:
This book is a tutorial on debugging techniques for both the beginning and intermediate programmer.Diese Einschätzung ist in meinen Augen noch übertrieben. Denn bereits geringe C++- oder Programmiererfahrungen machen große Teile des Inhalts irrelevant.
Ich habe versucht mich in die Rolle eines Lesers zu versetzen, der gerade anfängt seine ersten Programmiererfahrungen zu sammeln. Doch selbst unter diesen Umständen kann ich mit dem Buch nicht glücklich werden; dazu sind die dargebotenen Inhalte schlicht viel zu trivial.
Der Inhalt
Chapter 1 Introduction
Chapter 2 Common Syntax and Semantic Errors
Chapter 3 Tracing Techniques for Debugging
Chapter 4 Trace Debugging for More Advanced C++ Constructs
Chapter 5 Using an Interactive Debugger
Appendix A The 32 Most Common Bugs in First Programs
Appendix B Checklist for Error Detection and Prevention
In Kapitel 2 werden geläufige Syntax- und Semantik-Fehler besprochen. Wie/Wo treten sie auf? Wie korrigiert man sie? Beispiele: fehlendes Semikolon am Ende einer Anweisung, Return-Anweisung(en) vergessen,
=
statt ==
, nicht beachtete Operatoren-Reihenfolge, Off-By-One Error, Zugriff auf nicht gültige Array Indizes, ...Tracing using extra print statements probably is the single most important method for debugging computer programs.
Kapitel 3 und 4 bilden zusammen den Haupt- und zugleich schlechtesten Teil des Buches. Anhand einer Reihe von unnötig unübersichtlichen Beispielen zeigen Ford und Teorey hier auf 46 Seiten verteilt, dass man tatsächlich
std::cout
nutzen kann, um Variablen-Inhalte auszugeben! Äh, Vista-WOW!Wenigstens das Puffer-Konzept von Ausgabe-Streams hätte man hier besprechen können. Wenn Text zur Ausgabe (am Bildschirm) in einen Ausgabe-Stream geschickt wird, dann wird aus Performance Gründen nicht sofort jedes Zeichen direkt ausgegeben. Stattdessen werden die Zeichen in einem Zwischenpuffer (
streambuf
) gesammelt, welcher erst dann geleert wird (d.h. der Text wird in das eigentliche Ziel geschrieben), wenn bestimmte Ereignisse eintreten. Wie etwa: Es sind ausreichend viele Zeichen im Puffer, das Programmende wurde erreicht, Input von einem Eingabe-Stream soll gelesen werden, Stream wird geschlossen oder wenn ein Entleeren durch den Benutzer erzwungen wird (std::flush, std::cout.flush()
)Die Bespiele іm Buch verwenden allesamt
std::cout
(gepuffert) zur Fehlerdiagnose; rufen allerdings auch std::endl
auf und veranlassen somit neben der Ausgabe von '\n'
ein std::flush()
.Das fünfte Kapitel bietet eine kurze Einführung in die integrierten Debugger von Metrowerks CodeWarrior Professional Release 5 und Microsoft Visual C++ 6. Das gewählte Beispiel und die Erläuterungen sind zweckdienlich, doch die Screenshots des Microsoft Debuggers sind von einer äußerst geringen Qualität und kaum unleserlich.
Im Anhang folgt eine Liste von 32 häufigen (Anfänger-)Fehler und eine Liste mit allgemeinen Tipps zur Fehlervermeidung/-suche. überrascht hat mich schließlich die einseitige Bibliographie am Ende des Buches, denn hier finden sich durchwegs Referenzen zu einigen empfehlenswerten Büchern.
Posted by Wolfgang Kaufmann
in Bücher