Cut it down to the smallest failing case
Strip everything until only the bug is left.
This fails: <paste the code and the failure> Help me reduce it to the smallest thing that still fails. Give me an order to remove things in — largest and least likely to be involved first — checking after each removal that it still fails. I want to end up with something under 20 lines that reproduces it. If removing something makes the failure stop, that's the interesting part — tell me what to conclude from that.
The reduction usually finds the bug before you finish. Roughly half the time you never need to ask the actual question.