I agree and disagree.
When you are familiar or at lease somewhat familiar with a code base printf + careful thought is King. It also has the added benefit of forcing your to think through related edge cases you are missing or will miss if you fix the bug in a certain way.
But when you are working on a massive codebase with significant state being maintained, a debugger will go a looong way.