Are debuggers still useful? The main use of GNU debugger (gdb), for me, is to make sure I get a stack trace, like in Java. Putting break points and watching variables is just not something I do outside the code. Putting asserts and various checks in the code is far more valuable in my opinion even if it “dirties” (to dirty) the code.
One issue you must not forget about debuggers, is that once your code is deployed, you no longer have a debugger running on your client’s machine. Even if you don’t release your code, others might have to use it, and they may have trouble with it… What is worse is that some nasty problems only occur outside the debugger. I’ve never seen this happen under Linux, but I have seen i happen again and again under Windows. Also, consider that most modern applications are web applications. Of course, you can run a web application in “debugging” mode, but it is quite the same as web applications tend to be distributed (web server, database, etc.). I think you need to learn to debug applications live.
I will also add that it is well known that the Linux kernel is built is C with printf statements. If you can build something so complex without a debugger, using a nasty language like C… then debuggers are not so useful.
What I find tremendously useful are unit tests. We never have enough unit testing. And I don’t think it is stressed enough in the curriculum. If there is one thing you must learn from modern software engineering, it is not UML, it is not business processes, it is unit testing.