Debugging is a process of solving problems such as finding and removing errors from software programs. It is a cyclic procedure that involves both test execution and code correction. The most effective debugging method is to analyze the information associated with the symptoms of errors. To implement it effectively, a domain specialist must have the ability to accurately localize the majority of errors without using a computer.
If you have reached an impasse, postpone the consideration of the program
Our subconscious mind is a powerful mechanism for solving problems. What we often attribute to inspiration is just a subconscious mind work made to solve the problem, meanwhile our conscious activity is connected with something else, for example, with food, a walk or watching a movie. If you cannot localize the error in an acceptable timeframe (presumably 30 minutes for small programs and several hours for large ones), stop searching for errors and start doing some other work, since your productivity will, in any case, significantly decrease. The problem should be “forgotten” until you either subconsciously find solution to it, or relax and be ready to reconsider the symptoms of the error.
If software quality is your primary concern it is reasonable to outsource qa to third party partners for them to test software products while these are developed.
If you have come to a dead-end, assign someone else to perform the task.
By doing this, you will probably discover something new.
It often happens that simply by explaining the task to a good listener, you will suddenly find a solution to it without any help from the person.
Use debugging tools only as auxiliary tools
Do not use these tools instead of reflecting on the task. Tools such as dumps and traces are based on random error detection & correction approach. The experiments showed that programmers avoiding the use of debugging tools, even when debugging unfamiliar programs, are better at debugging code than those who use these tools.
Avoid experimentation. Use it only as a last resort
The most common mistake made by novice programmers involved in debugging activities is attempting to solve a problem by making experimental changes to the program (“I do not know what’s wrong, but I’ll change this DO statement and see what happens.”) This absolutely wrong approach cannot even be considered as a debugging process; it is based on chance. Experimentation not only reduces the probability of success, but often complicates the task, since new errors are introduced into the program.