Debugging Multi-Threaded Applications