In the years of my career, I've often been called on to debug things that other people were stuck on. Here I'm going to try to share the things that make me a good debugger.
As a C/C++ programmer there will come times when you won't be able to understand what's going on in the debugger without dropping down to the assembler level. This will teach you enough to be able to use gdb to debug assembler.
As a C/C++ programmer you will sometimes need to understand exactly how you a program starts up. Before reading this one though, you might want to read the Basic Assembler Debugging article. Like that one, this is directed at x86 linux developers.
With the best of intentions you can easily refer to something that has been freed. Often you get away with it, especially for read access because nothing's used the memory yet.