The first thing I do is to go through my code very closely and with a lot of coffee. I find this eliminates 95% of problems.
Serial line debugging is just using functions like debuglib/KPrintF() (sends data to the serial port, which can be intercepted with tools like sushi or a terminal on a null modem link since it is not always possible to use printf() or fprintf() functions.
Stuff like enforcer and mungwall just let you spot illegal memory accesses which in my experience are almost always down to oversights with pointers.