The linker has the ability to produce a linkage trace, giving a great deal of information. In the case of a multiply defined symbol, the programmer needs to look at each declaration of the symbol to see why more than one of them is a definition. Often using M-x grep within emacs can facilitate this process. The next-error command can be used to scan through all occurrences of the symbol in the specified set of files. By now all warnings should have been removed from the compilation of the program or be totally explained to anyone assisting.
Intermittent bugs are considerably more difficult to track down.
Check the initial values of objects and the values that get assigned. This should be a matter of habit for all new code, before other testing indicates the presence of a bug. In some cases, it pays to do this at the assembly language level. As a matter of course, you should also run the profiler gprof on your program to see where it spends its time. To do so you must compile with the -pg option set.