Several fast languages with garbage collectors have none of those problems.
[0]- Well, assuming "race conditions" means "data races". Obviously no tooling can prevent race conditions in general.
In Elixir and Erlang, mutating data is impossible, so those. A language like F# makes it easy to avoid race conditions as well, but it is possible if you use classes or the mutable keyword. Even then, you will not corrupt memory and are only having race conditions in terms of the order in which data is accessed. But is rarely a problem with a functional first approach. I never even need to use a debugger with F#.
Any language with asynchronous computations will have race condition surface area, but there are several high-level languages that makes this difficult.