I started coding by just dropping print statements in my code to debug it. In college I was introduced to gdb and I never looked back. I will not code without a debugger now, it's such a waste of time dropping print statements in code and re-running. I'm always surprised when I learn about some language I'm interested in and finding out that the standard way to write code is in a text editor without an LSP implementation and just print debugging everywhere. I don't even start trying a language if I can't put breakpoints in somewhere.
I find that being able to do either is best. Sometimes debuggers are amazing, sometimes they are not. It depends on what environment you are working on, what layer of the stack the problem resides in, and how complex the info is that you need to debug the problem. Being able to choose multiple paths to get information is better than locking down on one "always the right answer" technique.
If you debug an embedded app, or you are interacting with a realtime embedded device, often debugging does not work because of memory or speed limitations. Then short print statements do wonders.
Also it can help to figure out the order in which pieces of code accross the codebase are executed. It is my experience that in such case you would very easily loose track when using a debugger.
No need to fetishize tools. Sometimes a debugger is useful, in others you are better served with logging/metrics/traces, and yes even print statements.
For example, using print statements may encourage you to create a better model of the code: formulate hypothesis, test it. While debugging encourages more local reactive (not proactive) view of the runtime.
Idk what fetishizing is supposed to mean in this context, I'm saying that a debugger is vastly more efficient tool than rerunning the program over and over
I meant: do not put too much emphasis on any single tool. If all you know is debugger, try other instruments. You might find they are “vastly more efficient” (in certain context).
Support for breakpoint style debugging is a feature of the runtime, though coordination with the language is important. Some environments just can't support it whatever language you use.