"If <something> wasn't useful, it wouldn't exist" <- is a truth-free assertion. Lot's of things exist that aren't useful. But that's beside the point.
What? I really have no idea what you are talking about now... how could I apply that to either?
In general, yes. But in this context of tradesmen's tools, this is rarely true.
Tools that aren't useful gets forgotten or replaced.
Lots of statements makes no sense when taken out of their context.
I don't use my debugger as quality control in the way you describe, I use it to quickly track down problems in my own and other peoples code.
I find it's extremely useful to check my assumptions about the implementation with real life data, without having to pollute the code with asserts and printouts.
Things like watchpoints and memory dump views makes it easy to quickly see that each step of the process is behaving as expected.
I can quickly set up tests and tweaks on my code and see if the behavior changes as the current theory assumes.
I don't understand why people make such a big deal about it really, its just a quick way to find problems, and to quickly check if your assumptions about what the problem really is, is true...
Its not replacing anything, its just another tool you can use, making you an even more productive coder if used right. (like any other tool in software engineering really)
Sure, in a perfect world, of perfect software engineering, where all code is written by (bugfree) AIs, debuggers will be useless, but they are still very useful now
Talking about Quality Control, you shouldn't under estimate code reviews. (which this stepping through each line is a variant of). At one place I worked, we were forced to go through each line of code with a colleague, explaining what it did. Everyone was groaning, but you'd be surprised how many small potential issues where found that way. (I don't recommend that in general though, but on some critical software, it might be motivated)
Edited by Olof Hedman, 22 September 2012 - 12:48 PM.