All of the above. Depends on the language and the capabilities of the IDE I'm using with the language. Breakpoints aren't always supported. Printing something is okay, though I tend to shy away from that nowadays. I prefer logging (either console logging or log file).
A Chrome web app developer's view. I use log first, then break points if needed. For GUI apps there's actually one more thing I usually do that I would use a component called comp-debug to show the internal data, like this.state.x or this.props.x, and it's cheaper than a log:

I'm used to developing in many languages and for the most part, I use the same techniques for debugging, a.k.a printing variables and changing code flow. When available, I use breakpoints of course, but thats not always possible. Think embedded systems. For javascript on the client side, I use the console API.
Ryan Lynch
Software Engineer @ Squarespace
I'm a bit surprised that "print something" is more popular at the moment than using breakpoints to debug. I always compare doing logging to shining a flashlight in a dark room; you have to point it in the right direction to find what you're looking for. Using breakpoints is like turning on the light; you can look around and see everything and find what you're looking for more easily. As far as "something else" it might be language specific...but another approach might be writing and observing unit tests, which will indicate specific issues as you code.