The purpose of a debugger is to allow you to see what is going on inside another program while it executes. It is useful to find out what another program was doing at the moment it crashed. I know most people will recommend GNU gdb, Nemiver, Valgrind or IDE such as Eclipse. I use gdb when it is really required; otherwise I debug the old fashioned way using printf() or cout statements.
I’m often too lazy for this, but gdb is used when really needed. I found Eclipse as a good alternative to debug programs. In the old days Borland C (Turbo C) was good enough for most of us. It was pretty slick and easy to use. However, UNIX / Linux is altogether different story with vi and gcc. What do you use to debug your C/C++/Java programs under UNIX like operating systems?