For my money? Java, hands down.<p>I haven't worked in any environment that made it easier to do symbolic debugging, including attaching a symbolic debugger remotely (over the network) to a running process on another machine. Note that the process in question does need to have been started with certain specific command line arguments in order to do this, and most of the time you don't run your apps with the JDWP[1] stuff turned on, for security and performance reasons. But if you have a web app or something that's misbehaving, it's incredibly handy to be able to turn that on, fire up Eclipse (or whatever), connect the debugger, and use all your standard step over, step into, etc. debugging facilities[2].<p>[1]: <a href="https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/introclientissues005.html" rel="nofollow">https://docs.oracle.com/javase/8/docs/technotes/guides/troub...</a><p>[2]: <a href="https://dzone.com/articles/remote-debugging-java-applications-with-jdwp" rel="nofollow">https://dzone.com/articles/remote-debugging-java-application...</a>
I'll probably get a ton of pushback on this, but I never found huge value in debugging compared to using a strict type system and writing easily testable code. I haven't debugged, as in used an interactive debugger like gdb, in many many years, not counting occasions where I needed to reverse-engineer some C code.<p>I would prefer languages where the need for interactive debugging is minimized through the type system, good abstractions, and good testing frameworks. Functional languages (ideally strongly typed), or something like Rust, tend to fall into this category. And even for less strict languages, I find debugging to be significantly slower than spending upfront time writing testable abstractions, which usually means functional code that operates on immutable data structures when possible.<p>Debuggability is nice... but isn't not having to debug even better?
Not PHP. I did an internship at a PHP shop where the engineers used Jetbrains, so I assumed debugging was on the table. I spent a week on and off figuring out how to set up a good debugger and realized I was the only person in the ~20 engineer company with a functional debugger. I'd say it paid off but just barely. While modern PHP is far improved from what we often ding here on HN, it's still got its warts.
Haskell. Since functions are pure, you can jump straight to the function that gives the wrong output for some input, skipping the part where you have to get the program into a certain state for the bug to be able to manifest.