So basically this gives us four primary steps to debugging:
Familiarity with what a working system does.
Accepting that you don't already know the cause of the problem.
Looking at data until you know what causes the problem.
Fixing the cause and not the symptoms.
This sounds pretty simple, but I see people violate this formula all the time. In my experience, most programmers, when faced with a bug, want to sit around and think about it or talk about what might be causing it – both forms of guessing.
It's okay to talk to other people who might have information about the system or advice on where to look for data that would help you debug. But sitting around and collectively guessing what could cause the bug isn't really any better than sitting around and doing it yourself, except perhaps that you get to chat with your co-workers, which could be good if you like them. Mostly though what you're doing in that case is wasting a bunch of people's time instead of just wasting your own time...