Previous: 3.4 Interacting with the Operating System
Up: 3 Designing Programs Top Down
Next: 3.6 Common Errors
Previous Page: 3.4.2 Standard Files and Redirection
Next Page: 3.6 Common Errors
As programs become large, finding bugs and debugging become a time consuming
job. Debugging is an art that can be learned and developed. However, it
requires plenty of experience in writing and debugging programs.
The structured, top down approach to writing programs discussed in this chapter
is one valuable tool for producing quality, working programs.
However, there is no
substitute for extensive programming experience and the best way to gain
programming experience is to write, test, and debug programs;
write, test, and debug programs;
write, test, and debug programs; etc. etc.
Certain debugging guidelines are presented here to make
the learning process easier:
- The first step cannot be emphasized enough. Spend plenty of time in
preparing the algorithm. A logically clear algorithm is much easier to debug
than an ad hoc algorithm with many fixes for previously found bugs. Trial and
error programming may never be bug free.
- Use top down development for your algorithms, and use modular programming
for your implementation.
Top down development makes logic transparent at each stage and hides
unnecessary details by relegating them to later stages. Modular programming
localizes errors in small functions, which can be easily debugged.
- Document your program using comments as you write it. It is a poor habit to
delay documenting a program until it is done.
Frequently, the very process of documenting a
program makes the logic clearer and may well eliminate sources of errors.
- Trace your program flow manually. This means: examine what happens to
values of key variables at key points in the program. Use judicious starting
values for these variables. Particularly, check values of variables at critical
points, such as loop beginnings and ends, function calls, and other key points
in the program.
- If your compiler comes with a symbolic debugger, learn to use it.
The time spent to learn the use of a debugger makes debugging of most programs
an easier task.
- Otherwise, use trace statements in your program. That is, use statements to
print out values of key variables at key positions in the program to help
pin-point the program segment where the bug may be located. The program segment
containing a bug can be narrowed until the exact one or two lines of code are
pin-pointed. It is then easier to spot the error and correct it. Trace
statements are also called debug statements.
- Pin-point the functions which generate errors. Rewrite the functions if
they are overly complex or long. Many times, it is easier to rewrite a function
than to rectify poor logic.
- In program development, initially we need debug statements. Later, once a
program is debugged, the debug statements must be removed. C provides
conditional compilation which was discussed above. One use of
conditional compilation is to conditionally compile debug statements. Initially
the program, including debug statements, is compiled. Later, when the program
has been debugged, it can be compiled without compiling the debug statements.
Debug statements need not be removed from the code.
Previous: 3.4 Interacting with the Operating System
Up: 3 Designing Programs Top Down
Next: 3.6 Common Errors
Previous Page: 3.4.2 Standard Files and Redirection
Next Page: 3.6 Common Errors