The ultimate goal of debugging is to try and find the truth of the situation. Something is off. You expect the code or system to do x and it is off doing y. As we deploy code in different environments, running at crazy scale, or running distributed you can't always step through the code in a debugger or reproduce perfectly but you still need to be able to make progress.
At the end of the day there is code running somewhere in some order. Your goal is to figure out what is actually running. In a perfect universe you could pause and step through all the code running on every cpu in the system until then we are trying to get as close as possible to that level of understanding.
Obvisouly if you can run something locally and step through it in a debugger you should but for many systems this is not possible.