There is new unit testing functionality in Mathematica 10. I have not used it yet, but I plan to.
For Mathematica, I pretty much follow David Park's method of gradually building up functionality. It works very well, and if done properly, reduces or eliminates the need for a low level debugger.
When I started programming, there were no debuggers, at least not in the modern sense. I learned my craft in a way that is not that much different from the way I create Wolfram Language code. It also works well for languages like objective c or ANSI c. Most of the time when I 'needed' a debugger was where I had been sloppy in my coding.
I had a major c project involving thousands of pages of code. It works -- it is a real-time app that is up 24/7 and never crashes. I could rewrite the app using Wolfram language using a hundred pages of code, and I don't think I would need to use a low level debugger at all.
I think that the main point for you would be that Wolfram Language is not like c, c++, FORTRAN, or [insert favorite language here]. If you approach Mathematica the way that you treat these other languages, you will be fighting against the Wolfram Language, not using it to its full potential.
You can use Mathematica as a super graphical calculator and never run into these issues, but you can do so much more if you can undergo a paradigm shift. You may find, as I did, that your coding in c, etc. is improved from this new viewpoint.