Я всегда тратил некоторое время на написание или прививку гибкого средства ведения журналов для проектов, над которыми работал, и это всегда окупалось, превращая сложные ошибки в простые. По крайней мере, обертывание блокирующих примитивов в функции или методы, которые регистрируют до и после регистрации и отображают блокируемый объект, а поток, который выполняет блокировку, всегда помогал мне сосредоточиться на вызывающем потоке в течение нескольких минут - при условии, что конечно, проблему можно воспроизвести вообще.
Загрузка программы под отладчиком - это довольно ограниченный метод определения того, что произошло, когда процесс заходит в тупик, поскольку все, что он может вам дать, - это снимок того, как плохо вы запутались, а не пошаговое объяснение того, как вы облажался, что я считаю гораздо более полезным.