> The nice thing is that the deadlocked threads aren't going anywhere, and wait patiently for me to inspect them
Same opinion here. Both deadlocks and null pointer errors are fairly easy to debug. You can easily observe when exactly the happen, and the stack-trace typically delivers the answer what went wrong.
Other kind of race conditions like any memory corruptions can be such much worse to figure out.
That depends though. In Java/C# dereferencing a null reference is a runtime error and you can pinpoint exactly where it happened. In C++/Rust, dereferencing null pointers is undefined behavior since the compiler makes assumptions that a dereferenced pointer cannot be null.
Same opinion here. Both deadlocks and null pointer errors are fairly easy to debug. You can easily observe when exactly the happen, and the stack-trace typically delivers the answer what went wrong.
Other kind of race conditions like any memory corruptions can be such much worse to figure out.